UIBarButtonItem+Extension.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. //
  2. // UIBarButtonItem+Extension.m
  3. // JWlive
  4. //
  5. // Created by pican zhang on 16/3/18.
  6. // Copyright © 2016年 pican zhang. All rights reserved.
  7. //
  8. #import "UIBarButtonItem+Extension.h"
  9. #import <objc/runtime.h>
  10. @implementation BackView
  11. - (instancetype)initWithFrame:(CGRect)frame
  12. {
  13. self = [super initWithFrame:frame];
  14. if (self) {
  15. self.backgroundColor = [UIColor clearColor];
  16. }
  17. return self;
  18. }
  19. -(void)layoutSubviews{
  20. [super layoutSubviews];
  21. UINavigationBar *navBar = nil;
  22. UIView *aView = self.superview;
  23. while (aView) {
  24. if ([aView isKindOfClass:[UINavigationBar class]]) {
  25. navBar = (UINavigationBar *)aView;
  26. break;
  27. }
  28. aView = aView.superview;
  29. }
  30. UINavigationItem * navItem = (UINavigationItem *)navBar.items.lastObject;
  31. UIBarButtonItem *leftItem = navItem.leftBarButtonItem;
  32. UIBarButtonItem *rightItem = navItem.rightBarButtonItem;
  33. if (rightItem) {//右边按钮
  34. BackView *backView = rightItem.customView;
  35. if ([backView isKindOfClass:self.class]) {
  36. backView.btn.x = backView.frame.size.width -backView.btn.frame.size.width;
  37. }
  38. }
  39. if (leftItem) {//左边按钮
  40. // BackView *backView = leftItem.customView;
  41. }
  42. }
  43. @end
  44. @implementation UIBarButtonItem (createBtnItem)
  45. + (instancetype)itemWithImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action{
  46. return [self itemWithImage:image title:nil highImage:highImage contentEdge: UIEdgeInsetsMake(0,0,0,0)target:target action:(SEL)action];
  47. }
  48. + (instancetype)itemWithImage:(NSString *)image
  49. title:(NSString *)title highImage:(NSString *)highImage contentEdge:(UIEdgeInsets)contentEdge target:(id)target action:(SEL)action{
  50. UIButton *btn = [[UIButton alloc] init];
  51. [btn setImage:[UIImage imageNamed:image] forState:(UIControlStateNormal)];
  52. [btn setTitle:title forState:UIControlStateNormal];
  53. [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  54. btn.titleLabel.font = [UIFont systemFontOfSize:14];
  55. btn.frame = CGRectMake(0, 0, 44, 44);
  56. btn.contentEdgeInsets = contentEdge;
  57. btn.backgroundColor = [UIColor whiteColor];
  58. [btn setEnlargeEdge:30];
  59. [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
  60. // UIView* containerView = [[UIView alloc]init];
  61. // containerView.backgroundColor = [UIColor greenColor];
  62. // [containerView addSubview:btn];
  63. // if (contentEdge.right<0) {
  64. // containerView.frame = CGRectMake(-20, 0, 44, 44);
  65. // }else{
  66. // containerView.frame = CGRectMake(20, 0, 44, 44);
  67. // }
  68. return [[UIBarButtonItem alloc] initWithCustomView:btn];
  69. // BackView *customView = [[BackView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
  70. // UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:target action:action];
  71. // [customView addGestureRecognizer:tap];
  72. // customView.btn = [UIButton buttonWithType:UIButtonTypeCustom];
  73. // customView.btn.titleLabel.font = [UIFont systemFontOfSize:14.0];
  74. // // customView.btn.contentEdgeInsets = contentEdge;
  75. // [customView.btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
  76. // [customView.btn setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];
  77. // [customView.btn setTitle:title forState:UIControlStateNormal];
  78. // [customView.btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  79. // if (image) {
  80. // customView.btn.frame = CGRectMake(0, 0, customView.btn.currentImage.size.width, customView.btn.currentBackgroundImage.size.height);
  81. // }else{
  82. // customView.btn.frame = CGRectMake(0, 0, 44, 44);
  83. // }
  84. // customView.btn.frame = customView.bounds;
  85. // customView.btn.centerY = customView.center.y;
  86. // [customView.btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
  87. // [customView addSubview:customView.btn];
  88. // return [[UIBarButtonItem alloc] initWithCustomView:customView];
  89. }
  90. + (instancetype)itemWithFrame:(CGRect)frame Title:(NSString*)title titleFont:(UIFont*)font titleColor:(UIColor*)titleColor bkgColor:(UIColor*)bkgColor contentEdge:(UIEdgeInsets)contentEdge hasBorder:(BOOL)hasBorder borderBkgColor:(UIColor*)borderBkgColor target:(id)target action:(SEL)action{
  91. UIButton *btn = [[UIButton alloc] initWithFrame:frame];
  92. btn.backgroundColor = bkgColor;
  93. btn.titleLabel.textAlignment = UIBaselineAdjustmentAlignCenters;
  94. btn.titleLabel.font = font;
  95. [btn setTitle:title forState:(UIControlStateNormal)];
  96. [btn setTitleColor:titleColor forState:(UIControlStateNormal)];
  97. [btn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20];
  98. // btn.contentEdgeInsets = contentEdge;
  99. if (hasBorder) {
  100. btn.layer.borderColor = borderBkgColor.CGColor;
  101. btn.layer.borderWidth = 1.0;
  102. btn.layer.cornerRadius = 4.0;
  103. btn.layer.masksToBounds = YES;
  104. }
  105. // btn.titleEdgeInsets = UIEdgeInsetsMake(0,0, 0,0);
  106. [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
  107. return [[UIBarButtonItem alloc] initWithCustomView:btn];
  108. }
  109. + (instancetype)itemWithFrame:(CGRect)frame Title:(NSString*)title titleFont:(UIFont*)font titleColor:(UIColor*)titleColor target:(id)target action:(SEL)action{
  110. UIButton *btn = [[UIButton alloc] initWithFrame:frame];
  111. btn.titleLabel.textAlignment = UIBaselineAdjustmentAlignCenters;
  112. btn.titleLabel.font = font;
  113. btn.layer.cornerRadius = 2.0;
  114. btn.layer.borderWidth = 1.0;
  115. btn.layer.borderColor = [UIColor whiteColor].CGColor;
  116. [btn setTitle:title forState:(UIControlStateNormal)];
  117. [btn setTitleColor:titleColor forState:(UIControlStateNormal)];
  118. [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
  119. [btn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20];
  120. return [[UIBarButtonItem alloc] initWithCustomView:btn];
  121. }
  122. +(UIBarButtonItem *) text:(NSString *)text contentEdge:(UIEdgeInsets)contentEdge selector:(SEL)selecor target:(id)target
  123. {
  124. CGFloat width= [text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}].width;
  125. UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, 30)];
  126. [button setTitle:text forState:UIControlStateNormal];
  127. button.titleLabel.font = [UIFont systemFontOfSize:15];
  128. [button addTarget:target action:selecor forControlEvents:UIControlEventTouchUpInside];
  129. // button.contentEdgeInsets = contentEdge;
  130. return [[UIBarButtonItem alloc] initWithCustomView:button];
  131. }
  132. +(UIBarButtonItem *) icon:(NSString *)icon selector:(SEL)selecor target:(id)target
  133. {
  134. UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
  135. [button setImage:[UIImage imageNamed:icon] forState:UIControlStateNormal];
  136. [button addTarget:target action:selecor forControlEvents:UIControlEventTouchUpInside];
  137. return [[UIBarButtonItem alloc] initWithCustomView:button];
  138. }
  139. +(UIBarButtonItem *) back:(NSString *)title selector:(SEL)selecor target:(id)target
  140. {
  141. CGFloat width= [title sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18]}].width;
  142. UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, 30)];
  143. [button setTitle:title forState:UIControlStateNormal];
  144. button.titleLabel.font = [UIFont systemFontOfSize:18];
  145. [button addTarget:target action:selecor forControlEvents:UIControlEventTouchUpInside];
  146. [button setImage:[UIImage imageNamed:@"nav_back_normal"] forState:UIControlStateNormal];
  147. [button setTitleEdgeInsets:UIEdgeInsetsMake(0, -5, 0, 0)];
  148. [button setImageEdgeInsets:UIEdgeInsetsMake(1, -15, 0, 0)];
  149. return [[UIBarButtonItem alloc] initWithCustomView:button];
  150. }
  151. +(UIBarButtonItem*)itemWithImage:(NSString *)image title:(NSString *)title target:(id)target action:(SEL)action{
  152. UIView *backView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 60, 44)];
  153. UIButton *btn = [[UIButton alloc] init];
  154. [btn setTitle:title forState:UIControlStateNormal];
  155. [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  156. btn.titleLabel.font = [UIFont systemFontOfSize:12];
  157. btn.frame = CGRectMake(0, 0, 47, 44);
  158. [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, -8, 0, 0)];
  159. // btn.lineBreakMode = NSLineBreakByTruncatingTail;
  160. [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
  161. [backView addSubview:btn];
  162. UIImageView *imgV = [[UIImageView alloc]initWithFrame:CGRectMake(42, 18, 13, 7)];
  163. imgV.contentMode = UIViewContentModeScaleAspectFill;
  164. imgV.clipsToBounds = YES;
  165. imgV.image = [UIImage imageNamed:image];
  166. [backView addSubview:imgV];
  167. return [[UIBarButtonItem alloc] initWithCustomView:backView];
  168. }
  169. NSString *const ZYBarButtonItem_hasBadgeKey = @"ZYBarButtonItem_hasBadgeKey";
  170. NSString *const ZYBarButtonItem_badgeKey = @"ZYBarButtonItem_badgeKey";
  171. NSString *const ZYBarButtonItem_badgeSizeKey = @"ZYBarButtonItem_badgeSizeKey";
  172. NSString *const ZYBarButtonItem_badgeOriginXKey = @"ZYBarButtonItem_badgeOriginXKey";
  173. NSString *const ZYBarButtonItem_badgeOriginYKey = @"ZYBarButtonItem_badgeOriginYKey";
  174. NSString *const ZYBarButtonItem_badgeColorKey = @"ZYBarButtonItem_badgeColorKey";
  175. @end
  176. @implementation UIBarButtonItem (Badge)
  177. @dynamic hasBadge;
  178. @dynamic badgeSize,badgeOriginX,badgeOriginY;
  179. - (void)initBadge
  180. {
  181. UIView *superview = nil;
  182. if (self.customView) {
  183. superview = self.customView;
  184. superview.clipsToBounds = NO;
  185. } else if ([self respondsToSelector:@selector(view)] && [(id)self view]) {
  186. superview = [(id)self view];
  187. }
  188. [superview addSubview:self.badge];
  189. // 默认设置 default configure
  190. self.badgeColor = [UIColor redColor];
  191. self.badgeSize = 8;
  192. self.badgeOriginX = 26;
  193. self.badgeOriginY = 11;
  194. self.badge.hidden = YES;
  195. }
  196. - (void)showBadge
  197. {
  198. self.badge.hidden = NO;
  199. }
  200. - (void)hideBadge
  201. {
  202. self.badge.hidden = YES;
  203. }
  204. - (void)refreshBadge
  205. {
  206. self.badge.frame = (CGRect){self.badgeOriginX,self.badgeOriginY,self.badgeSize,self.badgeSize};
  207. self.badge.backgroundColor = self.badgeColor;
  208. self.badge.layer.cornerRadius = self.badgeSize/2;
  209. }
  210. #pragma mark ---------- badge getter & setter function -----------
  211. - (UIView *)badge
  212. {
  213. UIView *badge = (UIView *)objc_getAssociatedObject(self, &ZYBarButtonItem_badgeKey);
  214. if (!badge) {
  215. badge = [[UIView alloc] init];
  216. [self setBadge:badge];
  217. [self initBadge];
  218. }
  219. return badge;
  220. }
  221. - (void)setBadge:(UIView *)badge
  222. {
  223. objc_setAssociatedObject(self, &ZYBarButtonItem_badgeKey, badge, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  224. }
  225. - (UIColor *)badgeColor
  226. {
  227. return objc_getAssociatedObject(self, &ZYBarButtonItem_badgeColorKey);
  228. }
  229. - (void)setBadgeColor:(UIColor *)badgeColor
  230. {
  231. objc_setAssociatedObject(self, &ZYBarButtonItem_badgeColorKey, badgeColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  232. if (self.badge) {
  233. [self refreshBadge];
  234. }
  235. }
  236. -(CGFloat)badgeSize {
  237. NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_badgeSizeKey);
  238. return number.floatValue;
  239. }
  240. -(void)setBadgeSize:(CGFloat)badgeSize
  241. {
  242. NSNumber *number = [NSNumber numberWithDouble:badgeSize];
  243. objc_setAssociatedObject(self, &ZYBarButtonItem_badgeSizeKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  244. if (self.badge) {
  245. [self refreshBadge];
  246. }
  247. }
  248. -(CGFloat)badgeOriginX {
  249. NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_badgeOriginXKey);
  250. return number.floatValue;
  251. }
  252. -(void)setBadgeOriginX:(CGFloat)badgeOriginX
  253. {
  254. NSNumber *number = [NSNumber numberWithDouble:badgeOriginX];
  255. objc_setAssociatedObject(self, &ZYBarButtonItem_badgeOriginXKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  256. if (self.badge) {
  257. [self refreshBadge];
  258. }
  259. }
  260. -(CGFloat)badgeOriginY {
  261. NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_badgeOriginYKey);
  262. return number.floatValue;
  263. }
  264. -(void)setBadgeOriginY:(CGFloat)badgeOriginY
  265. {
  266. NSNumber *number = [NSNumber numberWithDouble:badgeOriginY];
  267. objc_setAssociatedObject(self, &ZYBarButtonItem_badgeOriginYKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  268. if (self.badge) {
  269. [self refreshBadge];
  270. }
  271. }
  272. - (void)setHasBadge:(BOOL)hasBadge
  273. {
  274. if (hasBadge) {
  275. [self showBadge];
  276. }else{
  277. [self hideBadge];
  278. }
  279. NSNumber *number = [NSNumber numberWithBool:hasBadge];
  280. objc_setAssociatedObject(self, &ZYBarButtonItem_hasBadgeKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  281. }
  282. - (BOOL)hasBadge
  283. {
  284. NSNumber *number = objc_getAssociatedObject(self, &ZYBarButtonItem_hasBadgeKey);
  285. return number.boolValue;
  286. }
  287. @end