iOS给Navigation的BarButton的加消息提醒角标

代码如下

给UIBarButtonItem加一个延展

.h文件如下

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface UIBarButtonItem (Badge)  
  4.   
  5. @property (strongnonatomicUILabel *badge;  
  6.   
  7. // Badge value to be display  
  8. @property (nonatomicNSString *badgeValue;  
  9. // Badge background color  
  10. @property (nonatomicUIColor *badgeBGColor;  
  11. // Badge text color  
  12. @property (nonatomicUIColor *badgeTextColor;  
  13. // Badge font  
  14. @property (nonatomicUIFont *badgeFont;  
  15. // Padding value for the badge  
  16. @property (nonatomic) CGFloat badgePadding;  
  17. // Minimum size badge to small  
  18. @property (nonatomic) CGFloat badgeMinSize;  
  19. // Values for offseting the badge over the BarButtonItem you picked  
  20. @property (nonatomic) CGFloat badgeOriginX;  
  21. @property (nonatomic) CGFloat badgeOriginY;  
  22. // In case of numbers, remove the badge when reaching zero  
  23. @property BOOL shouldHideBadgeAtZero;  
  24. // Badge has a bounce animation when value changes  
  25. @property BOOL shouldAnimateBadge;  
  26.   
  27.   
  28. @end  
.m文件如下

  1. #import "UIBarButtonItem+Badge.h"  
  2. #import <objc/runtime.h>  
  3.   
  4. NSString constconst *badgeKey = @"badgeKey";  
  5.   
  6. NSString constconst *badgeBGColorKey = @"badgeBGColorKey";  
  7. NSString constconst *badgeTextColorKey = @"badgeTextColorKey";  
  8. NSString constconst *badgeFontKey = @"badgeFontKey";  
  9. NSString constconst *badgePaddingKey = @"badgePaddingKey";  
  10. NSString constconst *badgeMinSizeKey = @"badgeMinSizeKey";  
  11. NSString constconst *badgeOriginXKey = @"badgeOriginXKey";  
  12. NSString constconst *badgeOriginYKey = @"badgeOriginYKey";  
  13. NSString constconst *shouldHideBadgeAtZeroKey = @"shouldHideBadgeAtZeroKey";  
  14. NSString constconst *shouldAnimateBadgeKey = @"shouldAnimateBadgeKey";  
  15. NSString constconst *badgeValueKey = @"badgeValueKey";  
  16.   
  17. @implementation UIBarButtonItem (Badge)  
  18. @dynamic badgeValue, badgeBGColor, badgeTextColor, badgeFont;  
  19. @dynamic badgePadding, badgeMinSize, badgeOriginX, badgeOriginY;  
  20. @dynamic shouldHideBadgeAtZero, shouldAnimateBadge;  
  21.   
  22.   
  23.   
  24. - (void)badgeInit  
  25. {  
  26.     // Default design initialization  
  27.     self.badgeBGColor   = [UIColor redColor];  
  28.     self.badgeTextColor = [UIColor whiteColor];  
  29.     self.badgeFont      = [UIFont systemFontOfSize:8.0];  
  30.     self.badgePadding   = 2;  
  31.     self.badgeMinSize   = 8;  
  32.     self.badgeOriginX   = self.customView.frame.size.width - self.badge.frame.size.width/2 ;  
  33.     self.badgeOriginY   = -4;  
  34.     self.shouldHideBadgeAtZero = YES;  
  35.     self.shouldAnimateBadge = YES;  
  36.     // Avoids badge to be clipped when animating its scale  
  37.     self.customView.clipsToBounds = NO;  
  38. }  
  39.   
  40. #pragma mark - Utility methods  
  41.   
  42. // Handle badge display when its properties have been changed (color, font, ...)  
  43. - (void)refreshBadge  
  44. {  
  45.     // Change new attributes  
  46.     self.badge.textColor        = self.badgeTextColor;  
  47.     self.badge.backgroundColor  = self.badgeBGColor;  
  48.     self.badge.font             = self.badgeFont;  
  49. }  
  50.   
  51. - (CGSize) badgeExpectedSize  
  52. {  
  53.     // When the value changes the badge could need to get bigger  
  54.     // Calculate expected size to fit new value  
  55.     // Use an intermediate label to get expected size thanks to sizeToFit  
  56.     // We don‘t call sizeToFit on the true label to avoid bad display  
  57.     UILabel *frameLabel = [self duplicateLabel:self.badge];  
  58.     [frameLabel sizeToFit];  
  59.       
  60.     CGSize expectedLabelSize = frameLabel.frame.size;  
  61.     return expectedLabelSize;  
  62. }  
  63.   
  64. - (void)updateBadgeFrame  
  65. {  
  66.       
  67.     CGSize expectedLabelSize = [self badgeExpectedSize];  
  68.       
  69.     // Make sure that for small value, the badge will be big enough  
  70.     CGFloat minHeight = expectedLabelSize.height;  
  71.       
  72.     // Using a const we make sure the badge respect the minimum size  
  73.     minHeight = (minHeight < self.badgeMinSize) ? self.badgeMinSize : expectedLabelSize.height;  
  74.     CGFloat minWidth = expectedLabelSize.width;  
  75.     CGFloat padding = self.badgePadding;  
  76.       
  77.     // Using const we make sure the badge doesn‘t get too smal  
  78.     minWidth = (minWidth < minHeight) ? minHeight : expectedLabelSize.width;  
  79.     self.badge.frame = CGRectMake(self.badgeOriginXself.badgeOriginY, minWidth + padding, minHeight + padding);  
  80.     self.badge.layer.cornerRadius = (minHeight + padding) / 2;  
  81.     self.badge.layer.masksToBounds = YES;  
  82. }  
  83.   
  84. // Handle the badge changing value  
  85. - (void)updateBadgeValueAnimated:(BOOL)animated  
  86. {  
  87.     // Bounce animation on badge if value changed and if animation authorized  
  88.     if (animated && self.shouldAnimateBadge && ![self.badge.text isEqualToString:self.badgeValue]) {  
  89.         CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];  
  90.         [animation setFromValue:[NSNumber numberWithFloat:1.5]];  
  91.         [animation setToValue:[NSNumber numberWithFloat:1]];  
  92.         [animation setDuration:0.2];  
  93.         [animation setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:.4f :1.3f :1.f :1.f]];  
  94.         [self.badge.layer addAnimation:animation forKey:@"bounceAnimation"];  
  95.     }  
  96.       
  97.     // Set the new value  
  98.     self.badge.text = self.badgeValue;  
  99.       
  100.     // Animate the size modification if needed  
  101.     NSTimeInterval duration = animated ? 0.2 : 0;  
  102.     [UIView animateWithDuration:duration animations:^{  
  103.         [self updateBadgeFrame];  
  104.     }];  
  105. }  
  106.   
  107. - (UILabel *)duplicateLabel:(UILabel *)labelToCopy  
  108. {  
  109.     UILabel *duplicateLabel = [[UILabel alloc] initWithFrame:labelToCopy.frame];  
  110.     duplicateLabel.text = labelToCopy.text;  
  111.     duplicateLabel.font = labelToCopy.font;  
  112.       
  113.     return duplicateLabel;  
  114. }  
  115.   
  116. - (void)removeBadge  
  117. {  
  118.     // Animate badge removal  
  119.     [UIView animateWithDuration:0.2 animations:^{  
  120.         self.badge.transform = CGAffineTransformMakeScale(00);  
  121.     } completion:^(BOOL finished) {  
  122.         [self.badge removeFromSuperview];  
  123.         self.badge = nil;  
  124.     }];  
  125. }  
  126.   
  127. #pragma mark - getters/setters  
  128. -(UILabel*) badge {  
  129.     return objc_getAssociatedObject(self, &badgeKey);  
  130. }  
  131. -(void)setBadge:(UILabel *)badgeLabel  
  132. {  
  133.     objc_setAssociatedObject(self, &badgeKey, badgeLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  134. }  
  135.   
  136. // Badge value to be display  
  137. -(NSString *)badgeValue {  
  138.     return objc_getAssociatedObject(self, &badgeValueKey);  
  139. }  
  140. -(void) setBadgeValue:(NSString *)badgeValue  
  141. {  
  142.     objc_setAssociatedObject(self, &badgeValueKey, badgeValue, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  143.       
  144.     // When changing the badge value check if we need to remove the badge  
  145.     if (!badgeValue || [badgeValue isEqualToString:@""] || ([badgeValue isEqualToString:@"0"] && self.shouldHideBadgeAtZero)) {  
  146.         [self removeBadge];  
  147.     } else if (!self.badge) {  
  148.         // Create a new badge because not existing  
  149.         self.badge                      = [[UILabel alloc] initWithFrame:CGRectMake(self.badgeOriginXself.badgeOriginY2020)];  
  150.         self.badge.textColor            = self.badgeTextColor;  
  151.         self.badge.backgroundColor      = self.badgeBGColor;  
  152.         self.badge.font                 = self.badgeFont;  
  153.         self.badge.textAlignment        = NSTextAlignmentCenter;  
  154.         [self badgeInit];  
  155.         [self.customView addSubview:self.badge];  
  156.         [self updateBadgeValueAnimated:NO];  
  157.     } else {  
  158.         [self updateBadgeValueAnimated:YES];  
  159.     }  
  160. }  
  161.   
  162. // Badge background color  
  163. -(UIColor *)badgeBGColor {  
  164.     return objc_getAssociatedObject(self, &badgeBGColorKey);  
  165. }  
  166. -(void)setBadgeBGColor:(UIColor *)badgeBGColor  
  167. {  
  168.     objc_setAssociatedObject(self, &badgeBGColorKey, badgeBGColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  169.     if (self.badge) {  
  170.         [self refreshBadge];  
  171.     }  
  172. }  
  173.   
  174. // Badge text color  
  175. -(UIColor *)badgeTextColor {  
  176.     return objc_getAssociatedObject(self, &badgeTextColorKey);  
  177. }  
  178. -(void)setBadgeTextColor:(UIColor *)badgeTextColor  
  179. {  
  180.     objc_setAssociatedObject(self, &badgeTextColorKey, badgeTextColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  181.     if (self.badge) {  
  182.         [self refreshBadge];  
  183.     }  
  184. }  
  185.   
  186. // Badge font  
  187. -(UIFont *)badgeFont {  
  188.     return objc_getAssociatedObject(self, &badgeFontKey);  
  189. }  
  190. -(void)setBadgeFont:(UIFont *)badgeFont  
  191. {  
  192.     objc_setAssociatedObject(self, &badgeFontKey, badgeFont, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  193.     if (self.badge) {  
  194.         [self refreshBadge];  
  195.     }  
  196. }  
  197.   
  198. // Padding value for the badge  
  199. -(CGFloat) badgePadding {  
  200.     NSNumber *number = objc_getAssociatedObject(self, &badgePaddingKey);  
  201.     return number.floatValue;  
  202. }  
  203. -(void) setBadgePadding:(CGFloat)badgePadding  
  204. {  
  205.     NSNumber *number = [NSNumber numberWithDouble:badgePadding];  
  206.     objc_setAssociatedObject(self, &badgePaddingKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  207.     if (self.badge) {  
  208.         [self updateBadgeFrame];  
  209.     }  
  210. }  
  211.   
  212. // Minimum size badge to small  
  213. -(CGFloat) badgeMinSize {  
  214.     NSNumber *number = objc_getAssociatedObject(self, &badgeMinSizeKey);  
  215.     return number.floatValue;  
  216. }  
  217. -(void) setBadgeMinSize:(CGFloat)badgeMinSize  
  218. {  
  219.     NSNumber *number = [NSNumber numberWithDouble:badgeMinSize];  
  220.     objc_setAssociatedObject(self, &badgeMinSizeKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  221.     if (self.badge) {  
  222.         [self updateBadgeFrame];  
  223.     }  
  224. }  
  225.   
  226. // Values for offseting the badge over the BarButtonItem you picked  
  227. -(CGFloat) badgeOriginX {  
  228.     NSNumber *number = objc_getAssociatedObject(self, &badgeOriginXKey);  
  229.     return number.floatValue;  
  230. }  
  231. -(void) setBadgeOriginX:(CGFloat)badgeOriginX  
  232. {  
  233.     NSNumber *number = [NSNumber numberWithDouble:badgeOriginX];  
  234.     objc_setAssociatedObject(self, &badgeOriginXKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  235.     if (self.badge) {  
  236.         [self updateBadgeFrame];  
  237.     }  
  238. }  
  239.   
  240. -(CGFloat) badgeOriginY {  
  241.     NSNumber *number = objc_getAssociatedObject(self, &badgeOriginYKey);  
  242.     return number.floatValue;  
  243. }  
  244. -(void) setBadgeOriginY:(CGFloat)badgeOriginY  
  245. {  
  246.     NSNumber *number = [NSNumber numberWithDouble:badgeOriginY];  
  247.     objc_setAssociatedObject(self, &badgeOriginYKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  248.     if (self.badge) {  
  249.         [self updateBadgeFrame];  
  250.     }  
  251. }  
  252.   
  253. // In case of numbers, remove the badge when reaching zero  
  254. -(BOOL) shouldHideBadgeAtZero {  
  255.     NSNumber *number = objc_getAssociatedObject(self, &shouldHideBadgeAtZeroKey);  
  256.     return number.boolValue;  
  257. }  
  258. - (void)setShouldHideBadgeAtZero:(BOOL)shouldHideBadgeAtZero  
  259. {  
  260.     NSNumber *number = [NSNumber numberWithBool:shouldHideBadgeAtZero];  
  261.     objc_setAssociatedObject(self, &shouldHideBadgeAtZeroKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  262. }  
  263.   
  264. // Badge has a bounce animation when value changes  
  265. -(BOOL) shouldAnimateBadge {  
  266.     NSNumber *number = objc_getAssociatedObject(self, &shouldAnimateBadgeKey);  
  267.     return number.boolValue;  
  268. }  
  269. - (void)setShouldAnimateBadge:(BOOL)shouldAnimateBadge  
  270. {  
  271.     NSNumber *number = [NSNumber numberWithBool:shouldAnimateBadge];  
  272.     objc_setAssociatedObject(self, &shouldAnimateBadgeKey, number, OBJC_ASSOCIATION_RETAIN_NONATOMIC);  
  273. }  

代码调用

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  *  添加角标 
  3.  */  
  4. -(void)addTopNotice{  
  5.     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];  
  6.     [button setImage:[UIImage imageNamed:@"tabbar_home"] forState:UIControlStateNormal];  
  7.     button.frame = CGRectMake(0,100,button.currentImage.size.width, button.currentImage.size.height);  
  8.     [button addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchDown];  
  9.       
  10.     // 添加角标  
  11.     UIBarButtonItem *navLeftButton = [[UIBarButtonItem alloc] initWithCustomView:button];  
  12.     self.navigationItem.rightBarButtonItem = navLeftButton;  
  13.     self.navigationItem.rightBarButtonItem.badgeValue = @"1";  
  14.     self.navigationItem.rightBarButtonItem.badgeBGColor = [UIColor redColor];  
  15.   
  16. }  

清除角标提醒

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  *  清除角标 
  3.  */  
  4. -(void)buttonPress:(id)sender  
  5. {  
  6.     NSLog(@"----");  
  7.     self.navigationItem.rightBarButtonItem.badgeValue = @"";  
  8. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值