ios button带角标

2018-12-21  本文已影响17人  溜溜leesin
WeChatf08fdbfd5336bb4facf3c416d22e7d10.png

借鉴大神无夜之星辰的文章

代码如下:

@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

无夜之星辰大大写的用的第三方masonry做的约束,不巧 我的这个项目没用这个三方,so...~~自己看了一下NSLayout来写了一下。

上一篇下一篇

猜你喜欢

热点阅读