123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- //
- // CALayer+YYAdd.m
- // YYKit <https://github.com/ibireme/YYKit>
- //
- // 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 "YYKitMacro.h"
- #import "YYCGUtilities.h"
- YYSYNTH_DUMMY_CLASS(CALayer_YYAdd)
- @implementation CALayer (YYAdd)
- - (UIImage *)snapshotImage {
- // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
- if (CGSizeEqualToSize(self.bounds.size, CGSizeZero)) {
- return nil;
- }
- 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
|