JJHeaders.m 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. //
  2. // JJHeaders.m
  3. // QQHeader
  4. //
  5. // Created by lijunjie on 16/1/5.
  6. // Copyright © 2016年 ljj. All rights reserved.
  7. //
  8. #import "JJHeaders.h"
  9. #import "JJCustomLayer.h"
  10. static inline float radians(double degrees) { return degrees * M_PI / 180; }
  11. @implementation JJHeaders
  12. + (UIView *)createHeaderView:(CGFloat)headerWH images:(NSArray<UIImage *> *)images;
  13. {
  14. if (!images || [images count] <= 0) {
  15. return nil;
  16. }
  17. UIView *view = nil;
  18. switch ([images count]) {
  19. case 1: {
  20. view = [JJHeaders getView1:headerWH images:images];
  21. break;
  22. }
  23. case 2: {
  24. view = [JJHeaders getView2:headerWH images:images];
  25. break;
  26. }
  27. case 3: {
  28. view = [JJHeaders getView3:headerWH images:images];
  29. break;
  30. }
  31. case 4: {
  32. view = [JJHeaders getView4:headerWH images:images];
  33. break;
  34. }
  35. case 5: {
  36. view = [JJHeaders getView5:headerWH images:images];
  37. break;
  38. }
  39. default:
  40. break;
  41. }
  42. return view;
  43. }
  44. + (UIView *)getView1:(CGFloat)headerWH images:(NSArray<UIImage *> *)images
  45. {
  46. CGFloat diameter = headerWH;
  47. CGFloat r = diameter / 2;
  48. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, headerWH, headerWH)];
  49. view.backgroundColor = [UIColor clearColor];
  50. UIImage *image = images[0];
  51. JJCustomLayer *layer0 = [JJCustomLayer createWithImage:image degrees:0 isClip:NO];
  52. layer0.frame = [JJHeaders getRect:CGPointMake(r, r) size:CGSizeMake(diameter, diameter)];
  53. [view.layer addSublayer:layer0];
  54. [layer0 setNeedsDisplay];
  55. return view;
  56. }
  57. + (UIView *)getView2:(CGFloat)headerWH images:(NSArray *)images
  58. {
  59. CGFloat diameter = (headerWH + headerWH - sqrtf(2) * headerWH);
  60. CGFloat r = diameter / 2;
  61. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, headerWH, headerWH)];
  62. view.backgroundColor = [UIColor clearColor];
  63. UIImage *image = images[0];
  64. CGSize imageSize = image.size;
  65. CGFloat correctScale = headerWH / imageSize.height;
  66. JJCustomLayer *layer0 = [JJCustomLayer createWithImage:image degrees:0 isClip:NO];
  67. layer0.frame = [JJHeaders getRect:CGPointMake(r, r) size:CGSizeMake(diameter, diameter)];
  68. [view.layer addSublayer:layer0];
  69. [layer0 setNeedsDisplay];
  70. image = images[1];
  71. imageSize = image.size;
  72. correctScale = headerWH / imageSize.height;
  73. JJCustomLayer *layer1 = [JJCustomLayer createWithImage:image degrees:180 - 45 isClip:YES];
  74. layer1.frame = [JJHeaders getRect:CGPointMake(r + sqrtf(2) * diameter / 2, r + sqrtf(2) * diameter / 2) size:CGSizeMake(diameter, diameter)];
  75. [view.layer addSublayer:layer1];
  76. [layer1 setNeedsDisplay];
  77. return view;
  78. }
  79. + (UIView *)getView3:(CGFloat)headerWH images:(NSArray *)images
  80. {
  81. CGFloat diameter = headerWH/2;
  82. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, headerWH, headerWH)];
  83. view.backgroundColor = [UIColor clearColor];
  84. CALayer *layer = [CALayer layer];
  85. layer.frame = CGRectMake(0, 0, 2 * diameter, diameter + sqrtf(3) / 2 * diameter);
  86. UIImage *image = images[0];
  87. CGSize imageSize = image.size;
  88. CGFloat correctScale = headerWH / imageSize.height;
  89. CGPoint center0 = CGPointMake(diameter, diameter / 2);
  90. JJCustomLayer *layer0 = [JJCustomLayer createWithImage:image degrees:30 isClip:YES];
  91. layer0.frame = [JJHeaders getRect:center0 size:CGSizeMake(diameter, diameter)];
  92. [layer addSublayer:layer0];
  93. [layer0 setNeedsDisplay];
  94. image = images[1];
  95. imageSize = image.size;
  96. correctScale = headerWH / imageSize.height;
  97. CGPoint center1 = CGPointMake(center0.x - diameter * sin(radians(30)), diameter / 2 + diameter * cos(radians(30)));
  98. JJCustomLayer *layer1 = [JJCustomLayer createWithImage:image degrees:270 isClip:YES];
  99. layer1.frame = [JJHeaders getRect:center1 size:CGSizeMake(diameter, diameter)];
  100. [layer addSublayer:layer1];
  101. [layer1 setNeedsDisplay];
  102. image = images[2];
  103. imageSize = image.size;
  104. correctScale = headerWH / imageSize.height;
  105. CGPoint center2 = CGPointMake(center1.x + diameter, center1.y);
  106. JJCustomLayer *layer2 = [JJCustomLayer createWithImage:image degrees:180 - 30 isClip:YES];
  107. layer2.frame = [JJHeaders getRect:center2 size:CGSizeMake(diameter, diameter)];
  108. [layer addSublayer:layer2];
  109. [layer2 setNeedsDisplay];
  110. CGRect f = layer.frame;
  111. f.origin.y = (view.frame.size.height - f.size.height) / 2;
  112. layer.frame = f;
  113. [view.layer addSublayer:layer];
  114. return view;
  115. }
  116. + (UIView *)getView4:(CGFloat)headerWH images:(NSArray *)images
  117. {
  118. CGFloat diameter = headerWH/2;
  119. CGFloat r = diameter / 2;
  120. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, headerWH, headerWH)];
  121. view.backgroundColor = [UIColor clearColor];
  122. UIImage *image = images[0];
  123. CGSize imageSize = image.size;
  124. CGFloat correctScale = headerWH / imageSize.height;
  125. CGPoint center0 = CGPointMake(r, r);
  126. JJCustomLayer *layer0 = [JJCustomLayer createWithImage:image degrees:0 isClip:YES];
  127. layer0.frame = [JJHeaders getRect:center0 size:CGSizeMake(diameter, diameter)];
  128. [view.layer addSublayer:layer0];
  129. [layer0 setNeedsDisplay];
  130. image = images[1];
  131. imageSize = image.size;
  132. correctScale = headerWH / imageSize.height;
  133. CGPoint center1 = CGPointMake(center0.x, center0.y + diameter);
  134. JJCustomLayer *layer1 = [JJCustomLayer createWithImage:image degrees:270 isClip:YES];
  135. layer1.frame = [JJHeaders getRect:center1 size:CGSizeMake(diameter, diameter)];
  136. [view.layer addSublayer:layer1];
  137. [layer1 setNeedsDisplay];
  138. image = images[2];
  139. imageSize = image.size;
  140. correctScale = headerWH / imageSize.height;
  141. CGPoint center2 = CGPointMake(center1.x + diameter, center1.y);
  142. JJCustomLayer *layer2 = [JJCustomLayer createWithImage:image degrees:180 isClip:YES];
  143. layer2.frame = [JJHeaders getRect:center2 size:CGSizeMake(diameter, diameter)];
  144. [view.layer addSublayer:layer2];
  145. [layer2 setNeedsDisplay];
  146. image = images[3];
  147. imageSize = image.size;
  148. correctScale = headerWH / imageSize.height;
  149. CGPoint center3 = CGPointMake(center2.x, center2.y - diameter);
  150. JJCustomLayer *layer3 = [JJCustomLayer createWithImage:image degrees:90 isClip:YES];
  151. layer3.frame = [JJHeaders getRect:center3 size:CGSizeMake(diameter, diameter)];
  152. [view.layer addSublayer:layer3];
  153. [layer3 setNeedsDisplay];
  154. return view;
  155. }
  156. + (UIView *)getView5:(CGFloat)headerWH images:(NSArray *)images
  157. {
  158. CGFloat r = headerWH / 2 / (2 * sin(radians(54)) + 1);
  159. CGFloat diameter = r * 2;
  160. CALayer *layer = [CALayer layer];
  161. layer.frame = CGRectMake(0, 0,headerWH, r / tan(radians(36)) + r / sin(radians(36)) + diameter);
  162. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, headerWH, headerWH)];
  163. view.backgroundColor = [UIColor clearColor];
  164. UIImage *image = images[0];
  165. CGSize imageSize = image.size;
  166. CGFloat correctScale = headerWH / imageSize.height;
  167. CGPoint center0 = CGPointMake(headerWH / 2, r);
  168. JJCustomLayer *layer0 = [JJCustomLayer createWithImage:image degrees:54 isClip:YES];
  169. layer0.frame = [JJHeaders getRect:center0 size:CGSizeMake(diameter, diameter)];
  170. [layer addSublayer:layer0];
  171. [layer0 setNeedsDisplay];
  172. image = images[1];
  173. imageSize = image.size;
  174. correctScale = headerWH / imageSize.height;
  175. CGPoint center1 = CGPointMake(center0.x - diameter * sin(radians(54)), center0.y + diameter * cos(radians(54)));
  176. JJCustomLayer *layer1 = [JJCustomLayer createWithImage:image degrees:270 + 72 isClip:YES];
  177. layer1.frame = [JJHeaders getRect:center1 size:CGSizeMake(diameter, diameter)];
  178. [layer addSublayer:layer1];
  179. [layer1 setNeedsDisplay];
  180. image = images[2];
  181. imageSize = image.size;
  182. correctScale = headerWH / imageSize.height;
  183. CGPoint center2 = CGPointMake(center1.x + diameter * cos(radians(72)), center1.y + diameter * sin(radians(72)));
  184. JJCustomLayer *layer2 = [JJCustomLayer createWithImage:image degrees:270 isClip:YES];
  185. layer2.frame = [JJHeaders getRect:center2 size:CGSizeMake(diameter, diameter)];
  186. [layer addSublayer:layer2];
  187. [layer2 setNeedsDisplay];
  188. image = images[3];
  189. imageSize = image.size;
  190. correctScale = headerWH / imageSize.height;
  191. CGPoint center3 = CGPointMake(center2.x + diameter, center2.y);
  192. JJCustomLayer *layer3 = [JJCustomLayer createWithImage:image degrees:180 + 18 isClip:YES];
  193. layer3.frame = [JJHeaders getRect:center3 size:CGSizeMake(diameter, diameter)];
  194. [layer addSublayer:layer3];
  195. [layer3 setNeedsDisplay];
  196. image = images[4];
  197. imageSize = image.size;
  198. correctScale = headerWH / imageSize.height;
  199. CGPoint center4 = CGPointMake(center3.x + diameter * cos(radians(72)), center3.y - diameter * sin(radians(72)));
  200. JJCustomLayer *layer4 = [JJCustomLayer createWithImage:image degrees:90 + 36 isClip:YES];
  201. layer4.frame = [JJHeaders getRect:center4 size:CGSizeMake(diameter, diameter)];
  202. [layer addSublayer:layer4];
  203. [layer4 setNeedsDisplay];
  204. CGRect f = layer.frame;
  205. f.origin.y = (view.frame.size.height - f.size.height) / 2;
  206. layer.frame = f;
  207. [view.layer addSublayer:layer];
  208. return view;
  209. }
  210. + (CGRect)getRect:(CGPoint)center size:(CGSize)size
  211. {
  212. return CGRectMake(center.x - size.width / 2, center.y - size.height / 2, size.width, size.height);
  213. }
  214. @end