CALayer+YYAdd.m 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. //
  2. // CALayer+YYAdd.m
  3. // YYKit <https://github.com/ibireme/YYKit>
  4. //
  5. // Created by ibireme on 14/5/10.
  6. // Copyright (c) 2015 ibireme.
  7. //
  8. // This source code is licensed under the MIT-style license found in the
  9. // LICENSE file in the root directory of this source tree.
  10. //
  11. #import "CALayer+YYAdd.h"
  12. @implementation CALayer (YYAdd)
  13. - (UIImage *)snapshotImage {
  14. UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0);
  15. CGContextRef context = UIGraphicsGetCurrentContext();
  16. [self renderInContext:context];
  17. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  18. UIGraphicsEndImageContext();
  19. return image;
  20. }
  21. - (NSData *)snapshotPDF {
  22. CGRect bounds = self.bounds;
  23. NSMutableData* data = [NSMutableData data];
  24. CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((__bridge CFMutableDataRef)data);
  25. CGContextRef context = CGPDFContextCreate(consumer, &bounds, NULL);
  26. CGDataConsumerRelease(consumer);
  27. if (!context) return nil;
  28. CGPDFContextBeginPage(context, NULL);
  29. CGContextTranslateCTM(context, 0, bounds.size.height);
  30. CGContextScaleCTM(context, 1.0, -1.0);
  31. [self renderInContext:context];
  32. CGPDFContextEndPage(context);
  33. CGPDFContextClose(context);
  34. CGContextRelease(context);
  35. return data;
  36. }
  37. - (void)setLayerShadow:(UIColor*)color offset:(CGSize)offset radius:(CGFloat)radius {
  38. self.shadowColor = color.CGColor;
  39. self.shadowOffset = offset;
  40. self.shadowRadius = radius;
  41. self.shadowOpacity = 1;
  42. self.shouldRasterize = YES;
  43. self.rasterizationScale = [UIScreen mainScreen].scale;
  44. }
  45. - (void)removeAllSublayers {
  46. while (self.sublayers.count) {
  47. [self.sublayers.lastObject removeFromSuperlayer];
  48. }
  49. }
  50. - (CGFloat)left {
  51. return self.frame.origin.x;
  52. }
  53. - (void)setLeft:(CGFloat)x {
  54. CGRect frame = self.frame;
  55. frame.origin.x = x;
  56. self.frame = frame;
  57. }
  58. - (CGFloat)top {
  59. return self.frame.origin.y;
  60. }
  61. - (void)setTop:(CGFloat)y {
  62. CGRect frame = self.frame;
  63. frame.origin.y = y;
  64. self.frame = frame;
  65. }
  66. - (CGFloat)right {
  67. return self.frame.origin.x + self.frame.size.width;
  68. }
  69. - (void)setRight:(CGFloat)right {
  70. CGRect frame = self.frame;
  71. frame.origin.x = right - frame.size.width;
  72. self.frame = frame;
  73. }
  74. - (CGFloat)bottom {
  75. return self.frame.origin.y + self.frame.size.height;
  76. }
  77. - (void)setBottom:(CGFloat)bottom {
  78. CGRect frame = self.frame;
  79. frame.origin.y = bottom - frame.size.height;
  80. self.frame = frame;
  81. }
  82. - (CGFloat)width {
  83. return self.frame.size.width;
  84. }
  85. - (void)setWidth:(CGFloat)width {
  86. CGRect frame = self.frame;
  87. frame.size.width = width;
  88. self.frame = frame;
  89. }
  90. - (CGFloat)height {
  91. return self.frame.size.height;
  92. }
  93. - (void)setHeight:(CGFloat)height {
  94. CGRect frame = self.frame;
  95. frame.size.height = height;
  96. self.frame = frame;
  97. }
  98. - (CGPoint)center {
  99. return CGPointMake(self.frame.origin.x + self.frame.size.width * 0.5,
  100. self.frame.origin.y + self.frame.size.height * 0.5);
  101. }
  102. - (void)setCenter:(CGPoint)center {
  103. CGRect frame = self.frame;
  104. frame.origin.x = center.x - frame.size.width * 0.5;
  105. frame.origin.y = center.y - frame.size.height * 0.5;
  106. self.frame = frame;
  107. }
  108. - (CGFloat)centerX {
  109. return self.frame.origin.x + self.frame.size.width * 0.5;
  110. }
  111. - (void)setCenterX:(CGFloat)centerX {
  112. CGRect frame = self.frame;
  113. frame.origin.x = centerX - frame.size.width * 0.5;
  114. self.frame = frame;
  115. }
  116. - (CGFloat)centerY {
  117. return self.frame.origin.y + self.frame.size.height * 0.5;
  118. }
  119. - (void)setCenterY:(CGFloat)centerY {
  120. CGRect frame = self.frame;
  121. frame.origin.y = centerY - frame.size.height * 0.5;
  122. self.frame = frame;
  123. }
  124. - (CGPoint)origin {
  125. return self.frame.origin;
  126. }
  127. - (void)setOrigin:(CGPoint)origin {
  128. CGRect frame = self.frame;
  129. frame.origin = origin;
  130. self.frame = frame;
  131. }
  132. - (CGSize)frameSize {
  133. return self.frame.size;
  134. }
  135. - (void)setFrameSize:(CGSize)size {
  136. CGRect frame = self.frame;
  137. frame.size = size;
  138. self.frame = frame;
  139. }
  140. - (CGFloat)transformRotation {
  141. NSNumber *v = [self valueForKeyPath:@"transform.rotation"];
  142. return v.doubleValue;
  143. }
  144. - (void)setTransformRotation:(CGFloat)v {
  145. [self setValue:@(v) forKeyPath:@"transform.rotation"];
  146. }
  147. - (CGFloat)transformRotationX {
  148. NSNumber *v = [self valueForKeyPath:@"transform.rotation.x"];
  149. return v.doubleValue;
  150. }
  151. - (void)setTransformRotationX:(CGFloat)v {
  152. [self setValue:@(v) forKeyPath:@"transform.rotation.x"];
  153. }
  154. - (CGFloat)transformRotationY {
  155. NSNumber *v = [self valueForKeyPath:@"transform.rotation.y"];
  156. return v.doubleValue;
  157. }
  158. - (void)setTransformRotationY:(CGFloat)v {
  159. [self setValue:@(v) forKeyPath:@"transform.rotation.y"];
  160. }
  161. - (CGFloat)transformRotationZ {
  162. NSNumber *v = [self valueForKeyPath:@"transform.rotation.z"];
  163. return v.doubleValue;
  164. }
  165. - (void)setTransformRotationZ:(CGFloat)v {
  166. [self setValue:@(v) forKeyPath:@"transform.rotation.z"];
  167. }
  168. - (CGFloat)transformScaleX {
  169. NSNumber *v = [self valueForKeyPath:@"transform.scale.x"];
  170. return v.doubleValue;
  171. }
  172. - (void)setTransformScaleX:(CGFloat)v {
  173. [self setValue:@(v) forKeyPath:@"transform.scale.x"];
  174. }
  175. - (CGFloat)transformScaleY {
  176. NSNumber *v = [self valueForKeyPath:@"transform.scale.y"];
  177. return v.doubleValue;
  178. }
  179. - (void)setTransformScaleY:(CGFloat)v {
  180. [self setValue:@(v) forKeyPath:@"transform.scale.y"];
  181. }
  182. - (CGFloat)transformScaleZ {
  183. NSNumber *v = [self valueForKeyPath:@"transform.scale.z"];
  184. return v.doubleValue;
  185. }
  186. - (void)setTransformScaleZ:(CGFloat)v {
  187. [self setValue:@(v) forKeyPath:@"transform.scale.z"];
  188. }
  189. - (CGFloat)transformScale {
  190. NSNumber *v = [self valueForKeyPath:@"transform.scale"];
  191. return v.doubleValue;
  192. }
  193. - (void)setTransformScale:(CGFloat)v {
  194. [self setValue:@(v) forKeyPath:@"transform.scale"];
  195. }
  196. - (CGFloat)transformTranslationX {
  197. NSNumber *v = [self valueForKeyPath:@"transform.translation.x"];
  198. return v.doubleValue;
  199. }
  200. - (void)setTransformTranslationX:(CGFloat)v {
  201. [self setValue:@(v) forKeyPath:@"transform.translation.x"];
  202. }
  203. - (CGFloat)transformTranslationY {
  204. NSNumber *v = [self valueForKeyPath:@"transform.translation.y"];
  205. return v.doubleValue;
  206. }
  207. - (void)setTransformTranslationY:(CGFloat)v {
  208. [self setValue:@(v) forKeyPath:@"transform.translation.y"];
  209. }
  210. - (CGFloat)transformTranslationZ {
  211. NSNumber *v = [self valueForKeyPath:@"transform.translation.z"];
  212. return v.doubleValue;
  213. }
  214. - (void)setTransformTranslationZ:(CGFloat)v {
  215. [self setValue:@(v) forKeyPath:@"transform.translation.z"];
  216. }
  217. - (CGFloat)transformDepth {
  218. return self.transform.m34;
  219. }
  220. - (void)setTransformDepth:(CGFloat)v {
  221. CATransform3D d = self.transform;
  222. d.m34 = v;
  223. self.transform = d;
  224. }
  225. - (void)addFadeAnimationWithDuration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve {
  226. if (duration <= 0) return;
  227. NSString *mediaFunction;
  228. switch (curve) {
  229. case UIViewAnimationCurveEaseInOut: {
  230. mediaFunction = kCAMediaTimingFunctionEaseOut;
  231. } break;
  232. case UIViewAnimationCurveEaseIn: {
  233. mediaFunction = kCAMediaTimingFunctionEaseIn;
  234. } break;
  235. case UIViewAnimationCurveEaseOut: {
  236. mediaFunction = kCAMediaTimingFunctionEaseInEaseOut;
  237. } break;
  238. case UIViewAnimationCurveLinear: {
  239. mediaFunction = kCAMediaTimingFunctionLinear;
  240. } break;
  241. default: {
  242. mediaFunction = kCAMediaTimingFunctionLinear;
  243. } break;
  244. }
  245. CATransition *transition = [CATransition animation];
  246. transition.duration = duration;
  247. transition.timingFunction = [CAMediaTimingFunction functionWithName:mediaFunction];
  248. transition.type = kCATransitionFade;
  249. [self addAnimation:transition forKey:@"yykit.fade"];
  250. }
  251. - (void)removePreviousFadeAnimation {
  252. [self removeAnimationForKey:@"yykit.fade"];
  253. }
  254. @end