JJCustomLayer.m 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //
  2. // JJCustomLayer.m
  3. // QQHeader
  4. //
  5. // Created by lijunjie on 15/12/28.
  6. // Copyright © 2015年 ljj. All rights reserved.
  7. //
  8. #import "JJCustomLayer.h"
  9. #import "JJHeadersConfig.h"
  10. static inline float radians(double degrees) { return degrees * M_PI / 180; }
  11. @interface JJCustomLayer ()
  12. @property (nonatomic, assign) NSInteger degrees;
  13. @property (nonatomic, strong) UIImage *image;
  14. @property (nonatomic, assign) BOOL isClip;
  15. @end
  16. @implementation JJCustomLayer
  17. - (instancetype)init
  18. {
  19. self = [super init];
  20. if (self) {
  21. _degrees = 0;
  22. _isClip = YES;
  23. }
  24. return self;
  25. }
  26. + (JJCustomLayer *)createWithImage:(UIImage *)image degrees:(NSInteger)degrees isClip:(BOOL)isClip
  27. {
  28. JJCustomLayer *res = [JJCustomLayer layer];
  29. [res updateWithImage:image degrees:degrees isClip:isClip];
  30. return res;
  31. }
  32. - (void)updateWithImage:(UIImage *)image degrees:(NSInteger)degrees isClip:(BOOL)isClip
  33. {
  34. _degrees = degrees;
  35. _image = image;
  36. _isClip = isClip;
  37. self.contentsScale = [UIScreen mainScreen].scale;
  38. }
  39. - (void)drawInContext:(CGContextRef)context
  40. {
  41. [super drawInContext:context];
  42. CGContextSetRGBFillColor(context, 0, 0, 1, 1);
  43. CGRect bounds = self.bounds;
  44. CGSize size = bounds.size;
  45. CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
  46. CGAffineTransform transform = CGAffineTransformIdentity;
  47. transform = CGAffineTransformTranslate(transform, center.x, center.y);
  48. transform = CGAffineTransformRotate(transform, radians(_degrees));
  49. transform = CGAffineTransformTranslate(transform, -center.x, -center.y);
  50. CGMutablePathRef path = CGPathCreateMutable();
  51. CGFloat headerClipHalfAngle = [JJHeadersConfig share].headerClipHalfAngle;
  52. if (_isClip) {
  53. CGPathAddArc(path, &transform, size.width / 2, size.height / 2, size.width / 2, radians((90 - headerClipHalfAngle)), radians(90 + headerClipHalfAngle), true);
  54. CGPathAddArcToPoint(path,&transform,
  55. size.width / 2,
  56. size.height / 2 + (size.width / 2 * sin(radians(90 - headerClipHalfAngle)) - size.width / 2 * sin(radians(headerClipHalfAngle)) * tan(radians(headerClipHalfAngle))),
  57. size.width / 2 + size.width / 2 * sin(radians(headerClipHalfAngle)),
  58. size.height / 2 + size.width / 2 * sin(radians(90 - headerClipHalfAngle)),
  59. size.width / 2);
  60. } else {
  61. CGPathAddArc(path, &transform, size.width / 2, size.height / 2, size.width / 2, radians((90)), radians(90 + 0.01), true);
  62. }
  63. // scale 由于输出的图不会进行缩放,所以缩放因子等于屏幕的scale即可
  64. UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0);
  65. UIBezierPath *bezierPath = [UIBezierPath bezierPathWithCGPath:path];
  66. [bezierPath closePath];
  67. [bezierPath addClip];
  68. [_image drawInRect:self.bounds];
  69. UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
  70. UIGraphicsEndImageContext();
  71. UIGraphicsPushContext( context );
  72. [maskedImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
  73. UIGraphicsPopContext();
  74. }
  75. @end