UIView+BadgeValue.m 2.26 KB


#import "UIView+BadgeValue.h"
#import <objc/runtime.h>

static char fl_badgeValue_static;

static CGFloat fl_badgeValue_height = 15;

@implementation UIView (BadgeValue)

- (void)setFl_badgeValue:(NSString *)fl_badgeValue{
    objc_setAssociatedObject(self, &fl_badgeValue_static, fl_badgeValue, OBJC_ASSOCIATION_COPY_NONATOMIC);
    if (fl_badgeValue == nil || [fl_badgeValue isEqualToString:@""] || ([self fl_isAllNumber:fl_badgeValue] && fl_badgeValue.integerValue <= 0)) {
        [self fl_clearBadgeValue];
    }
    else{
//        NSAssert([self fl_isAllNumber:fl_badgeValue], @"字符串内容必须是数字");
        CGRect rect = [fl_badgeValue  boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:[UIFont smallSystemFontSize]]} context:nil];
        // 创建红点
        UIButton *redBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, rect.size.width > fl_badgeValue_height ? rect.size.width + 6 : fl_badgeValue_height, fl_badgeValue_height)];
        redBtn.center = CGPointMake(self.frame.size.width, 0);
        redBtn.tag = 1008611;
        redBtn.layer.cornerRadius = fl_badgeValue_height / 2;
        redBtn.layer.masksToBounds = YES;
        redBtn.titleLabel.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]];
        
        redBtn.backgroundColor = [UIColor redColor];
        [redBtn setTitle:fl_badgeValue forState:UIControlStateNormal];
        [self addSubview:redBtn];
        [self bringSubviewToFront:redBtn];
    }
}

- (NSString *)fl_badgeValue{
    NSString *badgeValue = objc_getAssociatedObject(self, &fl_badgeValue_static);
    // 少于0 重置为0
    if (badgeValue.integerValue < 0) {
        return @"0";
    }
    else{
        return badgeValue;
    }
}

- (void)fl_clearBadgeValue{
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass:[UIButton class]] && view.tag == 1008611) {
            [view removeFromSuperview];
        }
    }
}

// 判断是否全是数字
- (BOOL)fl_isAllNumber:(NSString *)text{
    unichar str;
    for (NSInteger index = 0; index < text.length; index ++) {
        str = [text characterAtIndex:index];
        if (isdigit(str)) {
            return YES;
        }
    }
    return NO;
}

@end