12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- //
- // JJCustomLayer.m
- // QQHeader
- //
- // Created by lijunjie on 15/12/28.
- // Copyright © 2015年 ljj. All rights reserved.
- //
- #import "JJCustomLayer.h"
- #import "JJHeadersConfig.h"
- static inline float radians(double degrees) { return degrees * M_PI / 180; }
- @interface JJCustomLayer ()
- @property (nonatomic, assign) NSInteger degrees;
- @property (nonatomic, strong) UIImage *image;
- @property (nonatomic, assign) BOOL isClip;
- @end
- @implementation JJCustomLayer
- - (instancetype)init
- {
- self = [super init];
- if (self) {
- _degrees = 0;
- _isClip = YES;
- }
- return self;
- }
- + (JJCustomLayer *)createWithImage:(UIImage *)image degrees:(NSInteger)degrees isClip:(BOOL)isClip
- {
- JJCustomLayer *res = [JJCustomLayer layer];
- [res updateWithImage:image degrees:degrees isClip:isClip];
- return res;
- }
- - (void)updateWithImage:(UIImage *)image degrees:(NSInteger)degrees isClip:(BOOL)isClip
- {
- _degrees = degrees;
- _image = image;
- _isClip = isClip;
- self.contentsScale = [UIScreen mainScreen].scale;
- }
- - (void)drawInContext:(CGContextRef)context
- {
- [super drawInContext:context];
- CGContextSetRGBFillColor(context, 0, 0, 1, 1);
- CGRect bounds = self.bounds;
- CGSize size = bounds.size;
- CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
- CGAffineTransform transform = CGAffineTransformIdentity;
- transform = CGAffineTransformTranslate(transform, center.x, center.y);
- transform = CGAffineTransformRotate(transform, radians(_degrees));
- transform = CGAffineTransformTranslate(transform, -center.x, -center.y);
- CGMutablePathRef path = CGPathCreateMutable();
- CGFloat headerClipHalfAngle = [JJHeadersConfig share].headerClipHalfAngle;
- if (_isClip) {
- CGPathAddArc(path, &transform, size.width / 2, size.height / 2, size.width / 2, radians((90 - headerClipHalfAngle)), radians(90 + headerClipHalfAngle), true);
- CGPathAddArcToPoint(path,&transform,
- size.width / 2,
- size.height / 2 + (size.width / 2 * sin(radians(90 - headerClipHalfAngle)) - size.width / 2 * sin(radians(headerClipHalfAngle)) * tan(radians(headerClipHalfAngle))),
- size.width / 2 + size.width / 2 * sin(radians(headerClipHalfAngle)),
- size.height / 2 + size.width / 2 * sin(radians(90 - headerClipHalfAngle)),
- size.width / 2);
- } else {
- CGPathAddArc(path, &transform, size.width / 2, size.height / 2, size.width / 2, radians((90)), radians(90 + 0.01), true);
- }
-
- // scale 由于输出的图不会进行缩放,所以缩放因子等于屏幕的scale即可
- UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0);
- UIBezierPath *bezierPath = [UIBezierPath bezierPathWithCGPath:path];
- [bezierPath closePath];
- [bezierPath addClip];
- [_image drawInRect:self.bounds];
- UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
-
- UIGraphicsPushContext( context );
- [maskedImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
- UIGraphicsPopContext();
- }
- @end
|