WMZPageNaviBtn.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. //
  2. // WMZPageNaviBtn.m
  3. // WMZPageController
  4. //
  5. // Created by wmz on 2019/9/22.
  6. // Copyright © 2019 wmz. All rights reserved.
  7. //
  8. #import "WMZPageNaviBtn.h"
  9. @interface WMZPageNaviBtn()
  10. @property(nonatomic,assign)CGSize minSize;
  11. @end
  12. @implementation WMZPageNaviBtn
  13. -(void)setRadii:(CGSize)size RoundingCorners:(UIRectCorner)rectCorner {
  14. //设置只有一半圆角
  15. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:rectCorner cornerRadii:size];
  16. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  17. maskLayer.frame = self.bounds;
  18. maskLayer.path = maskPath.CGPath;
  19. self.layer.mask = maskLayer;
  20. }
  21. - (CGSize)maxSize{
  22. if (!_maxSize.width||!_maxSize.height) {
  23. _maxSize = [self boundingRectWithSize:self.titleLabel.text Font:self.titleLabel.font Size:
  24. CGSizeMake(CGFLOAT_MAX, self.param.wMenuPosition == PageMenuPositionNavi?35:CGFLOAT_MAX)];
  25. }
  26. return _maxSize;
  27. }
  28. /*
  29. txt:label或button的title
  30. font:字体大小
  31. size:允许最大size
  32. */
  33. -(CGSize)boundingRectWithSize:(NSString*)txt Font:(UIFont*) font Size:(CGSize)size{
  34. CGSize _size;
  35. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
  36. NSDictionary *attribute = @{NSFontAttributeName: font};
  37. NSStringDrawingOptions options = NSStringDrawingTruncatesLastVisibleLine |
  38. NSStringDrawingUsesLineFragmentOrigin |
  39. NSStringDrawingUsesFontLeading;
  40. _size = [txt boundingRectWithSize:size options: options attributes:attribute context:nil].size;
  41. #else
  42. _size = [txt sizeWithFont:font constrainedToSize:size];
  43. #endif
  44. return _size;
  45. }
  46. - (void)TagSetImagePosition:(PageBtnPosition)postion spacing:(CGFloat)spacing {
  47. CGFloat imgW = self.imageView.image.size.width;
  48. CGFloat imgH = self.imageView.image.size.height;
  49. CGSize trueSize = CGSizeMake(self.maxSize.width, self.maxSize.height);
  50. CGFloat trueLabW = trueSize.width;
  51. CGFloat trueLabH = trueSize.height;
  52. // if (self.max) {
  53. // trueLabW -= (imgW+spacing+spacing);
  54. // }
  55. //image中心移动的x距离
  56. CGFloat imageOffsetX = trueLabW/2 ;
  57. //image中心移动的y距离
  58. CGFloat imageOffsetY = trueLabH/2 + spacing/2;
  59. //label左边缘移动的x距离
  60. CGFloat labelOffsetX1 = imgW/2 - trueLabW/2 + trueLabW/2;
  61. //label右边缘移动的x距离
  62. CGFloat labelOffsetX2 = imgW/2 + trueLabW/2 - trueLabW/2;
  63. //label中心移动的y距离
  64. CGFloat labelOffsetY = imgH/2 + spacing/2;
  65. switch (postion) {
  66. case PageBtnPositionLeft:
  67. self.imageEdgeInsets = UIEdgeInsetsMake(0, -spacing/2, 0, spacing/2);
  68. self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing/2, 0, -spacing/2);
  69. break;
  70. case PageBtnPositionRight:
  71. self.imageEdgeInsets = UIEdgeInsetsMake(0, trueLabW + spacing/2, 0, -(trueLabW + spacing/2));
  72. self.titleEdgeInsets = UIEdgeInsetsMake(0, -(imgW + spacing/2), 0, imgW + spacing/2);
  73. break;
  74. case PageBtnPositionTop:
  75. self.imageEdgeInsets = UIEdgeInsetsMake(-imageOffsetY, imageOffsetX, imageOffsetY, -imageOffsetX);
  76. self.titleEdgeInsets = UIEdgeInsetsMake(labelOffsetY, -labelOffsetX1, -labelOffsetY, labelOffsetX2);
  77. break;
  78. case PageBtnPositionBottom:
  79. self.imageEdgeInsets = UIEdgeInsetsMake(imageOffsetY, imageOffsetX, -imageOffsetY, -imageOffsetX);
  80. self.titleEdgeInsets = UIEdgeInsetsMake(-labelOffsetY, -labelOffsetX1, labelOffsetY, labelOffsetX2);
  81. break;
  82. default:
  83. break;
  84. }
  85. }
  86. - (void)viewShadowPathWithColor:(UIColor *)shadowColor shadowOpacity:(CGFloat)shadowOpacity shadowRadius:(CGFloat)shadowRadius shadowPathType:(PageShadowPathType)shadowPathType shadowPathWidth:(CGFloat)shadowPathWidth{
  87. self.layer.masksToBounds = NO;//必须要等于NO否则会把阴影切割隐藏掉
  88. self.layer.shadowColor = shadowColor.CGColor;// 阴影颜色
  89. self.layer.shadowOpacity = shadowOpacity;// 阴影透明度,默认0
  90. self.layer.shadowOffset = CGSizeZero;//shadowOffset阴影偏移,默认(0, -3),这个跟shadowRadius配合使用
  91. self.layer.shadowRadius = shadowRadius;//阴影半径,默认3
  92. CGRect shadowRect = CGRectZero;
  93. CGFloat originX,originY,sizeWith,sizeHeight;
  94. originX = 0;
  95. originY = 0;
  96. sizeWith = self.bounds.size.width;
  97. sizeHeight = self.bounds.size.height;
  98. if (shadowPathType == PageShadowPathTop) {
  99. shadowRect = CGRectMake(originX, originY-shadowPathWidth/2, sizeWith, shadowPathWidth);
  100. }else if (shadowPathType == PageShadowPathBottom){
  101. shadowRect = CGRectMake(originY, sizeHeight-shadowPathWidth/2, sizeWith, shadowPathWidth);
  102. }else if (shadowPathType == PageShadowPathLeft){
  103. shadowRect = CGRectMake(originX-shadowPathWidth/2, originY+sizeHeight/4, shadowPathWidth, sizeHeight/2);
  104. }else if (shadowPathType == PageShadowPathRight){
  105. shadowRect = CGRectMake(sizeWith-shadowPathWidth/2, originY, shadowPathWidth, sizeHeight);
  106. }else if (shadowPathType == PageShadowPathCommon){
  107. shadowRect = CGRectMake(originX-shadowPathWidth/2, 2, sizeWith+shadowPathWidth, sizeHeight+shadowPathWidth/2);
  108. }else if (shadowPathType == PageShadowPathAround){
  109. shadowRect = CGRectMake(originX-shadowPathWidth/2, originY-shadowPathWidth/2, sizeWith+shadowPathWidth, sizeHeight+shadowPathWidth);
  110. }
  111. UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRect:shadowRect];
  112. self.layer.shadowPath = bezierPath.CGPath;//阴影路径
  113. }
  114. - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state{
  115. [super setTitleColor:color forState:state];
  116. CGFloat red = 0.0;
  117. CGFloat green = 0.0;
  118. CGFloat blue = 0.0;
  119. CGFloat alpha = 0.0;
  120. [color getRed:&red green:&green blue:&blue alpha:&alpha];
  121. if (state == UIControlStateNormal) {
  122. self.unSelectedColorR = red;
  123. self.unSelectedColorB = blue;
  124. self.unSelectedColorG = green;
  125. }else{
  126. self.selectedColorR = red;
  127. self.selectedColorB = blue;
  128. self.selectedColorG = green;
  129. }
  130. }
  131. @end
  132. static char badgeViewKey;
  133. static NSInteger const pointWidth = 7; //小红点的宽高
  134. @implementation WMZPageNaviBtn (HMBadge)
  135. - (void)showBadgeWithTopMagin:(CGFloat)magin
  136. {
  137. if (self.badge == nil) {
  138. CGRect frame = CGRectMake(self.maxSize.width+self.param.wMenuCellMargin/2, self.param.wMenuCellPadding/2-pointWidth, pointWidth, pointWidth);
  139. self.badge = [[UILabel alloc] initWithFrame:frame];
  140. self.badge.backgroundColor = PageColor(0xff5153);
  141. self.badge.layer.cornerRadius = pointWidth / 2;
  142. self.badge.layer.masksToBounds = YES;
  143. [self addSubview:self.badge];
  144. [self bringSubviewToFront:self.badge];
  145. }
  146. }
  147. - (void)hidenBadge
  148. {
  149. if (self.badge) {
  150. [self.badge removeFromSuperview];
  151. }
  152. }
  153. #pragma mark - GetterAndSetter
  154. - (UILabel *)badge
  155. {
  156. return objc_getAssociatedObject(self, &badgeViewKey);
  157. }
  158. - (void)setBadge:(UILabel *)badge
  159. {
  160. objc_setAssociatedObject(self, &badgeViewKey, badge, OBJC_ASSOCIATION_RETAIN);
  161. }
  162. @end
  163. @implementation UIColor (GradientColor)
  164. + (instancetype)bm_colorGradientChangeWithSize:(CGSize)size
  165. direction:(PageGradientChangeDirection)direction
  166. startColor:(UIColor*)startcolor
  167. endColor:(UIColor*)endColor{
  168. if(CGSizeEqualToSize(size,CGSizeZero) || !startcolor || !endColor) {
  169. return nil;
  170. }
  171. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  172. gradientLayer.frame=CGRectMake(0,0, size.width, size.height);
  173. CGPoint startPoint = CGPointZero;
  174. if (direction == PageGradientChangeDirectionDownDiagonalLine) {
  175. startPoint =CGPointMake(0.0,1.0);
  176. }
  177. gradientLayer.startPoint= startPoint;
  178. CGPoint endPoint = CGPointZero;
  179. switch(direction) {
  180. case PageGradientChangeDirectionLevel:
  181. endPoint =CGPointMake(1.0,0.0);
  182. break;
  183. case PageGradientChangeDirectionVertical:
  184. endPoint =CGPointMake(0.0,1.0);
  185. break;
  186. case PageGradientChangeDirectionUpwardDiagonalLine:
  187. endPoint =CGPointMake(1.0,1.0);
  188. break;
  189. case PageGradientChangeDirectionDownDiagonalLine:
  190. endPoint =CGPointMake(1.0,0.0);
  191. break;
  192. default:
  193. break;
  194. }
  195. gradientLayer.endPoint= endPoint;
  196. gradientLayer.colors=@[(__bridge id)startcolor.CGColor, (__bridge id)endColor.CGColor];
  197. UIGraphicsBeginImageContext(size);
  198. [gradientLayer renderInContext:UIGraphicsGetCurrentContext()];
  199. UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
  200. UIGraphicsEndImageContext();
  201. return [UIColor colorWithPatternImage:image];
  202. }
  203. @end
  204. @implementation UIView(PageBorder)
  205. - (void)viewPathWithColor:(UIColor *)shadowColor PathType:(PageShadowPathType)shadowPathType PathWidth:(CGFloat)shadowPathWidth heightScale:(CGFloat)sacle{
  206. CGRect shadowRect = CGRectZero;
  207. CGFloat originX,originY,sizeWith,sizeHeight;
  208. originX = 0;
  209. originY = self.bounds.size.height*(1-sacle)/2;
  210. sizeWith = self.bounds.size.width;
  211. sizeHeight = self.bounds.size.height*sacle;
  212. if (shadowPathType == PageShadowPathTop) {
  213. shadowRect = CGRectMake(originX, originY-shadowPathWidth/2, sizeWith, shadowPathWidth);
  214. }else if (shadowPathType == PageShadowPathBottom){
  215. shadowRect = CGRectMake(originY, sizeHeight-shadowPathWidth/2, sizeWith, shadowPathWidth);
  216. }else if (shadowPathType == PageShadowPathLeft){
  217. shadowRect = CGRectMake(originX-shadowPathWidth/2, originY+sizeHeight/4, shadowPathWidth, sizeHeight/2);
  218. }else if (shadowPathType == PageShadowPathRight){
  219. shadowRect = CGRectMake(sizeWith-shadowPathWidth/2, originY, shadowPathWidth, sizeHeight);
  220. }else if (shadowPathType == PageShadowPathCommon){
  221. shadowRect = CGRectMake(originX-shadowPathWidth/2, 2, sizeWith+shadowPathWidth, sizeHeight+shadowPathWidth/2);
  222. }else if (shadowPathType == PageShadowPathAround){
  223. shadowRect = CGRectMake(originX-shadowPathWidth/2, originY-shadowPathWidth/2, sizeWith+shadowPathWidth, sizeHeight+shadowPathWidth);
  224. }
  225. UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRect:shadowRect];
  226. CAShapeLayer *layer = [CAShapeLayer layer];
  227. layer.path = bezierPath.CGPath;
  228. layer.fillColor = shadowColor.CGColor;
  229. [self.layer addSublayer:layer];
  230. }
  231. @end