CALayer+YYAdd.m 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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. - (void)setLayerShadow:(UIColor*)color offset:(CGSize)offset radius:(CGFloat)radius {
  22. self.shadowColor = color.CGColor;
  23. self.shadowOffset = offset;
  24. self.shadowRadius = radius;
  25. self.shadowOpacity = 1;
  26. self.shouldRasterize = YES;
  27. self.rasterizationScale = [UIScreen mainScreen].scale;
  28. }
  29. - (void)removeAllSublayers {
  30. while (self.sublayers.count) {
  31. [self.sublayers.lastObject removeFromSuperlayer];
  32. }
  33. }
  34. - (CGFloat)left {
  35. return self.frame.origin.x;
  36. }
  37. - (void)setLeft:(CGFloat)x {
  38. CGRect frame = self.frame;
  39. frame.origin.x = x;
  40. self.frame = frame;
  41. }
  42. - (CGFloat)top {
  43. return self.frame.origin.y;
  44. }
  45. - (void)setTop:(CGFloat)y {
  46. CGRect frame = self.frame;
  47. frame.origin.y = y;
  48. self.frame = frame;
  49. }
  50. - (CGFloat)right {
  51. return self.frame.origin.x + self.frame.size.width;
  52. }
  53. - (void)setRight:(CGFloat)right {
  54. CGRect frame = self.frame;
  55. frame.origin.x = right - frame.size.width;
  56. self.frame = frame;
  57. }
  58. - (CGFloat)bottom {
  59. return self.frame.origin.y + self.frame.size.height;
  60. }
  61. - (void)setBottom:(CGFloat)bottom {
  62. CGRect frame = self.frame;
  63. frame.origin.y = bottom - frame.size.height;
  64. self.frame = frame;
  65. }
  66. - (CGFloat)width {
  67. return self.frame.size.width;
  68. }
  69. - (void)setWidth:(CGFloat)width {
  70. CGRect frame = self.frame;
  71. frame.size.width = width;
  72. self.frame = frame;
  73. }
  74. - (CGFloat)height {
  75. return self.frame.size.height;
  76. }
  77. - (void)setHeight:(CGFloat)height {
  78. CGRect frame = self.frame;
  79. frame.size.height = height;
  80. self.frame = frame;
  81. }
  82. - (CGPoint)center {
  83. return CGPointMake(self.frame.origin.x + self.frame.size.width * 0.5,
  84. self.frame.origin.y + self.frame.size.height * 0.5);
  85. }
  86. - (void)setCenter:(CGPoint)center {
  87. CGRect frame = self.frame;
  88. frame.origin.x = center.x - frame.size.width * 0.5;
  89. frame.origin.y = center.y - frame.size.height * 0.5;
  90. self.frame = frame;
  91. }
  92. - (CGFloat)centerX {
  93. return self.frame.origin.x + self.frame.size.width * 0.5;
  94. }
  95. - (void)setCenterX:(CGFloat)centerX {
  96. CGRect frame = self.frame;
  97. frame.origin.x = centerX - frame.size.width * 0.5;
  98. self.frame = frame;
  99. }
  100. - (CGFloat)centerY {
  101. return self.frame.origin.y + self.frame.size.height * 0.5;
  102. }
  103. - (void)setCenterY:(CGFloat)centerY {
  104. CGRect frame = self.frame;
  105. frame.origin.y = centerY - frame.size.height * 0.5;
  106. self.frame = frame;
  107. }
  108. - (CGPoint)origin {
  109. return self.frame.origin;
  110. }
  111. - (void)setOrigin:(CGPoint)origin {
  112. CGRect frame = self.frame;
  113. frame.origin = origin;
  114. self.frame = frame;
  115. }
  116. - (CGSize)frameSize {
  117. return self.frame.size;
  118. }
  119. - (void)setFrameSize:(CGSize)size {
  120. CGRect frame = self.frame;
  121. frame.size = size;
  122. self.frame = frame;
  123. }
  124. - (CGFloat)transformRotation {
  125. NSNumber *v = [self valueForKeyPath:@"transform.rotation"];
  126. return v.doubleValue;
  127. }
  128. - (void)setTransformRotation:(CGFloat)v {
  129. [self setValue:@(v) forKeyPath:@"transform.rotation"];
  130. }
  131. - (CGFloat)transformRotationX {
  132. NSNumber *v = [self valueForKeyPath:@"transform.rotation.x"];
  133. return v.doubleValue;
  134. }
  135. - (void)setTransformRotationX:(CGFloat)v {
  136. [self setValue:@(v) forKeyPath:@"transform.rotation.x"];
  137. }
  138. - (CGFloat)transformRotationY {
  139. NSNumber *v = [self valueForKeyPath:@"transform.rotation.y"];
  140. return v.doubleValue;
  141. }
  142. - (void)setTransformRotationY:(CGFloat)v {
  143. [self setValue:@(v) forKeyPath:@"transform.rotation.y"];
  144. }
  145. - (CGFloat)transformRotationZ {
  146. NSNumber *v = [self valueForKeyPath:@"transform.rotation.z"];
  147. return v.doubleValue;
  148. }
  149. - (void)setTransformRotationZ:(CGFloat)v {
  150. [self setValue:@(v) forKeyPath:@"transform.rotation.z"];
  151. }
  152. - (CGFloat)transformScaleX {
  153. NSNumber *v = [self valueForKeyPath:@"transform.scale.x"];
  154. return v.doubleValue;
  155. }
  156. - (void)setTransformScaleX:(CGFloat)v {
  157. [self setValue:@(v) forKeyPath:@"transform.scale.x"];
  158. }
  159. - (CGFloat)transformScaleY {
  160. NSNumber *v = [self valueForKeyPath:@"transform.scale.y"];
  161. return v.doubleValue;
  162. }
  163. - (void)setTransformScaleY:(CGFloat)v {
  164. [self setValue:@(v) forKeyPath:@"transform.scale.y"];
  165. }
  166. - (CGFloat)transformScaleZ {
  167. NSNumber *v = [self valueForKeyPath:@"transform.scale.z"];
  168. return v.doubleValue;
  169. }
  170. - (void)setTransformScaleZ:(CGFloat)v {
  171. [self setValue:@(v) forKeyPath:@"transform.scale.z"];
  172. }
  173. - (CGFloat)transformScale {
  174. NSNumber *v = [self valueForKeyPath:@"transform.scale"];
  175. return v.doubleValue;
  176. }
  177. - (void)setTransformScale:(CGFloat)v {
  178. [self setValue:@(v) forKeyPath:@"transform.scale"];
  179. }
  180. - (CGFloat)transformTranslationX {
  181. NSNumber *v = [self valueForKeyPath:@"transform.translation.x"];
  182. return v.doubleValue;
  183. }
  184. - (void)setTransformTranslationX:(CGFloat)v {
  185. [self setValue:@(v) forKeyPath:@"transform.translation.x"];
  186. }
  187. - (CGFloat)transformTranslationY {
  188. NSNumber *v = [self valueForKeyPath:@"transform.translation.y"];
  189. return v.doubleValue;
  190. }
  191. - (void)setTransformTranslationY:(CGFloat)v {
  192. [self setValue:@(v) forKeyPath:@"transform.translation.y"];
  193. }
  194. - (CGFloat)transformTranslationZ {
  195. NSNumber *v = [self valueForKeyPath:@"transform.translation.z"];
  196. return v.doubleValue;
  197. }
  198. - (void)setTransformTranslationZ:(CGFloat)v {
  199. [self setValue:@(v) forKeyPath:@"transform.translation.z"];
  200. }
  201. - (CGFloat)transformDepth {
  202. return self.transform.m34;
  203. }
  204. - (void)setTransformDepth:(CGFloat)v {
  205. CATransform3D d = self.transform;
  206. d.m34 = v;
  207. self.transform = d;
  208. }
  209. - (void)addFadeAnimationWithDuration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve {
  210. if (duration <= 0) return;
  211. NSString *mediaFunction;
  212. switch (curve) {
  213. case UIViewAnimationCurveEaseInOut: {
  214. mediaFunction = kCAMediaTimingFunctionEaseOut;
  215. } break;
  216. case UIViewAnimationCurveEaseIn: {
  217. mediaFunction = kCAMediaTimingFunctionEaseIn;
  218. } break;
  219. case UIViewAnimationCurveEaseOut: {
  220. mediaFunction = kCAMediaTimingFunctionEaseInEaseOut;
  221. } break;
  222. case UIViewAnimationCurveLinear: {
  223. mediaFunction = kCAMediaTimingFunctionLinear;
  224. } break;
  225. default: {
  226. mediaFunction = kCAMediaTimingFunctionLinear;
  227. } break;
  228. }
  229. CATransition *transition = [CATransition animation];
  230. transition.duration = duration;
  231. transition.timingFunction = [CAMediaTimingFunction functionWithName:mediaFunction];
  232. transition.type = kCATransitionFade;
  233. [self addAnimation:transition forKey:@"yykit.fade"];
  234. }
  235. - (void)removePreviousFadeAnimation {
  236. [self removeAnimationForKey:@"yykit.fade"];
  237. }
  238. @end