// // CALayer+YYAdd.m // YYCategories // // Created by ibireme on 14/5/10. // Copyright (c) 2015 ibireme. // // This source code is licensed under the MIT-style license found in the // LICENSE file in the root directory of this source tree. // #import "CALayer+YYAdd.h" #import "YYCategoriesMacro.h" #import "YYCGUtilities.h" YYSYNTH_DUMMY_CLASS(CALayer_YYAdd) @implementation CALayer (YYAdd) - (UIImage *)snapshotImage { UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0); CGContextRef context = UIGraphicsGetCurrentContext(); [self renderInContext:context]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } - (NSData *)snapshotPDF { CGRect bounds = self.bounds; NSMutableData* data = [NSMutableData data]; CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((__bridge CFMutableDataRef)data); CGContextRef context = CGPDFContextCreate(consumer, &bounds, NULL); CGDataConsumerRelease(consumer); if (!context) return nil; CGPDFContextBeginPage(context, NULL); CGContextTranslateCTM(context, 0, bounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); [self renderInContext:context]; CGPDFContextEndPage(context); CGPDFContextClose(context); CGContextRelease(context); return data; } - (void)setLayerShadow:(UIColor*)color offset:(CGSize)offset radius:(CGFloat)radius { self.shadowColor = color.CGColor; self.shadowOffset = offset; self.shadowRadius = radius; self.shadowOpacity = 1; self.shouldRasterize = YES; self.rasterizationScale = [UIScreen mainScreen].scale; } - (void)removeAllSublayers { while (self.sublayers.count) { [self.sublayers.lastObject removeFromSuperlayer]; } } - (CGFloat)left { return self.frame.origin.x; } - (void)setLeft:(CGFloat)x { CGRect frame = self.frame; frame.origin.x = x; self.frame = frame; } - (CGFloat)top { return self.frame.origin.y; } - (void)setTop:(CGFloat)y { CGRect frame = self.frame; frame.origin.y = y; self.frame = frame; } - (CGFloat)right { return self.frame.origin.x + self.frame.size.width; } - (void)setRight:(CGFloat)right { CGRect frame = self.frame; frame.origin.x = right - frame.size.width; self.frame = frame; } - (CGFloat)bottom { return self.frame.origin.y + self.frame.size.height; } - (void)setBottom:(CGFloat)bottom { CGRect frame = self.frame; frame.origin.y = bottom - frame.size.height; self.frame = frame; } - (CGFloat)width { return self.frame.size.width; } - (void)setWidth:(CGFloat)width { CGRect frame = self.frame; frame.size.width = width; self.frame = frame; } - (CGFloat)height { return self.frame.size.height; } - (void)setHeight:(CGFloat)height { CGRect frame = self.frame; frame.size.height = height; self.frame = frame; } - (CGPoint)center { return CGPointMake(self.frame.origin.x + self.frame.size.width * 0.5, self.frame.origin.y + self.frame.size.height * 0.5); } - (void)setCenter:(CGPoint)center { CGRect frame = self.frame; frame.origin.x = center.x - frame.size.width * 0.5; frame.origin.y = center.y - frame.size.height * 0.5; self.frame = frame; } - (CGFloat)centerX { return self.frame.origin.x + self.frame.size.width * 0.5; } - (void)setCenterX:(CGFloat)centerX { CGRect frame = self.frame; frame.origin.x = centerX - frame.size.width * 0.5; self.frame = frame; } - (CGFloat)centerY { return self.frame.origin.y + self.frame.size.height * 0.5; } - (void)setCenterY:(CGFloat)centerY { CGRect frame = self.frame; frame.origin.y = centerY - frame.size.height * 0.5; self.frame = frame; } - (CGPoint)origin { return self.frame.origin; } - (void)setOrigin:(CGPoint)origin { CGRect frame = self.frame; frame.origin = origin; self.frame = frame; } - (CGSize)frameSize { return self.frame.size; } - (void)setFrameSize:(CGSize)size { CGRect frame = self.frame; frame.size = size; self.frame = frame; } - (CGFloat)transformRotation { NSNumber *v = [self valueForKeyPath:@"transform.rotation"]; return v.doubleValue; } - (void)setTransformRotation:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.rotation"]; } - (CGFloat)transformRotationX { NSNumber *v = [self valueForKeyPath:@"transform.rotation.x"]; return v.doubleValue; } - (void)setTransformRotationX:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.rotation.x"]; } - (CGFloat)transformRotationY { NSNumber *v = [self valueForKeyPath:@"transform.rotation.y"]; return v.doubleValue; } - (void)setTransformRotationY:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.rotation.y"]; } - (CGFloat)transformRotationZ { NSNumber *v = [self valueForKeyPath:@"transform.rotation.z"]; return v.doubleValue; } - (void)setTransformRotationZ:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.rotation.z"]; } - (CGFloat)transformScaleX { NSNumber *v = [self valueForKeyPath:@"transform.scale.x"]; return v.doubleValue; } - (void)setTransformScaleX:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.scale.x"]; } - (CGFloat)transformScaleY { NSNumber *v = [self valueForKeyPath:@"transform.scale.y"]; return v.doubleValue; } - (void)setTransformScaleY:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.scale.y"]; } - (CGFloat)transformScaleZ { NSNumber *v = [self valueForKeyPath:@"transform.scale.z"]; return v.doubleValue; } - (void)setTransformScaleZ:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.scale.z"]; } - (CGFloat)transformScale { NSNumber *v = [self valueForKeyPath:@"transform.scale"]; return v.doubleValue; } - (void)setTransformScale:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.scale"]; } - (CGFloat)transformTranslationX { NSNumber *v = [self valueForKeyPath:@"transform.translation.x"]; return v.doubleValue; } - (void)setTransformTranslationX:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.translation.x"]; } - (CGFloat)transformTranslationY { NSNumber *v = [self valueForKeyPath:@"transform.translation.y"]; return v.doubleValue; } - (void)setTransformTranslationY:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.translation.y"]; } - (CGFloat)transformTranslationZ { NSNumber *v = [self valueForKeyPath:@"transform.translation.z"]; return v.doubleValue; } - (void)setTransformTranslationZ:(CGFloat)v { [self setValue:@(v) forKeyPath:@"transform.translation.z"]; } - (CGFloat)transformDepth { return self.transform.m34; } - (void)setTransformDepth:(CGFloat)v { CATransform3D d = self.transform; d.m34 = v; self.transform = d; } - (UIViewContentMode)contentMode { return YYCAGravityToUIViewContentMode(self.contentsGravity); } - (void)setContentMode:(UIViewContentMode)contentMode { self.contentsGravity = YYUIViewContentModeToCAGravity(contentMode); } - (void)addFadeAnimationWithDuration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve { if (duration <= 0) return; NSString *mediaFunction; switch (curve) { case UIViewAnimationCurveEaseInOut: { mediaFunction = kCAMediaTimingFunctionEaseInEaseOut; } break; case UIViewAnimationCurveEaseIn: { mediaFunction = kCAMediaTimingFunctionEaseIn; } break; case UIViewAnimationCurveEaseOut: { mediaFunction = kCAMediaTimingFunctionEaseOut; } break; case UIViewAnimationCurveLinear: { mediaFunction = kCAMediaTimingFunctionLinear; } break; default: { mediaFunction = kCAMediaTimingFunctionLinear; } break; } CATransition *transition = [CATransition animation]; transition.duration = duration; transition.timingFunction = [CAMediaTimingFunction functionWithName:mediaFunction]; transition.type = kCATransitionFade; [self addAnimation:transition forKey:@"yykit.fade"]; } - (void)removePreviousFadeAnimation { [self removeAnimationForKey:@"yykit.fade"]; } @end