借鉴大神无夜之星辰的文章
代码如下:
@interface HBButton : UIButton
- (void)showBadgeWithNumber:(NSInteger)badgeNumber;
- (void)hideBadge;
@end
---------------
#import "HBButton.h"
@interface HBButton()
@property (nonatomic, strong) UILabel *badgeLabel;
@end
@implementation HBButton
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.clipsToBounds = NO;
[self.titleLabel setFont:[UIFont systemFontOfSize:16]];
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
///badge
self.badgeLabel = [[UILabel alloc]init];
[self addSubview:self.badgeLabel];
self.badgeLabel.backgroundColor = [UIColor redColor];
self.badgeLabel.textColor = [UIColor whiteColor];
self.badgeLabel.layer.cornerRadius = 6;
self.badgeLabel.clipsToBounds = YES;
///下面这句一定要加!!!!不然报错!自动布局技术是苹果在iOS 6当中新加入的,但在那时仍然有很多项目代码使用autoresizingMask与setFrame:的方式构建界面。试想,如果将一个已经设置好frame并使用autoresizingMask的视图添加到一个使用自动布局的视图中时,运行时需要隐式地将前者的frame和autoresizingMask转化为自动布局约束(这些隐式转换的约束的类型为NSAutoresizingMaskLayoutConstraint),这样才能明确其位置与尺寸而不会导致约束的缺失。这个隐式转换的过程,是由UIView的translatesAutoresizingMaskIntoConstraints属性的值决定的。默认情况下,为了保证兼容性,该值为YES,表示需要自动进行隐式转换。这对于兼容旧的代码当然是好的,然而当我们明确为视图添加了约束后,我们就不希望再进行autoresizingMask的隐式转换了,否则就会引起约束的冲突。因此,需要特别注意的是,当我们使用代码创建视图时,需要将translatesAutoresizingMaskIntoConstraints属性的值设置为NO
self.badgeLabel.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint constraintWithItem:self.badgeLabel
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationLessThanOrEqual
toItem:self.titleLabel
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:-5].active = YES;
[NSLayoutConstraint constraintWithItem:self.badgeLabel
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationLessThanOrEqual
toItem:self.titleLabel
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:5].active = YES;
[NSLayoutConstraint constraintWithItem:self.badgeLabel
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:18].active = YES;
}
return self;
}
#pragma mark - 显示角标
/**
显示角标
@param badgeNumber 角标数量
*/
- (void)showBadgeWithNumber:(NSInteger)badgeNumber{
self.badgeLabel.hidden = NO;
// 注意数字前后各留一个空格,不然太紧凑
self.badgeLabel.text = [NSString stringWithFormat:@" %ld ",badgeNumber];
}
#pragma mark - 隐藏角标
/** 隐藏角标 */
- (void)hideBadge{
self.badgeLabel.hidden = YES;
}
@end
网友评论