1.利用runtime在类别category中添加属性
@property (nonatomic,strong) YHBadgeLabel *badgeLabel; 因为在ios中在类别中只可以添加方法,不能添加属性,但是可以通过runtime动态的添加属性,其原理是:就是通过设置关联对象,相当于oc中的键值对应关系。
设置关键字 staticNSString *const kYHBadgeLabel =@"kYHBadgeLabel";
#pragma mark - get/set
-(YHBadgeLabel*) badgeLabel{
//通过retime取得关联对象 因为在类别中不允许有实例变量
//通过关键字取得关联对象
return objc_getAssociatedObject(self, &kYHBadgeLabel);
}
set方法
-(void) setBadgeLabel:(YHBadgeLabel*)badgeLabel{
//设置关联对象
/*
源对象 ---> self
关键字 ---> &kYHBadgeLabel
关联的对象 ---> badgeLabel
关联策略 ---> OBJC_ASSOCIATION_RETAIN_NONATOMIC
*/
objc_setAssociatedObject(self, &kYHBadgeLabel, badgeLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
这样通过runtime对badgeLabel增加get方法和set方法 ,在类别中 就可以使用badgeLabel属性了。
#pragma mark - private
//懒加载 YHBadgeLabel
-(void) lazyLoadingBadgeLabel{
//因为在Category 不能有实例变量 所以为了初始化YHBadgeLabel 只能通过runtime的关联对象来 进行初始化
if(!self.badgeLabel) {
self.badgeLabel = [YHBadgeLabel defaultAllocYHBadgeLabel];
self.badgeLabel.center=CGPointMake(self.yh_width,0);
[selfaddSubview:self.badgeLabel];
[self bringSubviewToFront:self.badgeLabel];
}
}
一下是利用类别写的一个小红点组件,引入UIView+YHBadgeView.h文件就能使用
UIView+YHBadgeView.h文件
UIView+YHBadgeView.m文件
YHBadgeLabel.h 小红点label
最后调用
给tabbaritem添加小红点
#pragma mark - 获取Badge的父视图 (tabbarItem上使用)
- (UIView*) tabbarView{
//通过XCode视图调试工具找到UITabBarItem原生Badge父视图
UIView*tabBarButton = [selfvalueForKey:@"_view"];
for(UIView*subViewintabBarButton.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UITabBarSwappableImageView")]) {
returnsubView;
}
}
returntabBarButton;
}
给导航栏navigationItem添加小红点
#pragma mark - 获取Badge的父视图 (navigationItem上使用)
- (UIView*) navigationView {
//通过XCode视图调试工具找到navigationItem原生Badge父视图
UIView*navigationButton = [selfvalueForKey:@"_view"];
for(UIView*subViewinnavigationButton.subviews) {
if ([subView isKindOfClass:NSClassFromString(@"UIImageView")]) {
returnsubView;
}
}
returnnavigationButton;
}