//
|
// CALayer+YYAdd.m
|
// YYCategories <https://github.com/ibireme/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
|