要迭代新版本了,产品又加需求了...
问题分析:
需求是,在头像上加一个vip标志,恰巧之前头像这块是单独写的直接放到cell里的,并没有封装.
且慢,封装?
之前的头像能点击进入个人中心, 所以用的是UIButton,怎么在UIButton上做文章呢?
怎么把这个vip跟button联系起来呢?最好是button上有个开关来控制是否显示这个vip标志.
思路:
1,要给button添加一个属性
2,根据属性的值判断是否显示vip标志
这么一分析接下来要怎么写代码就变得简单了
1,创建一个UIButton的分类
2.添加开关和一个uiimageview控件
3.在.m文件里 #import<objc/runtime.h>
4.接下来就是核心代码了
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
//把vipimageView与buton关联到一起
-(UIImageView *)vipImagView{
return objc_getAssociatedObject(self, &Button_VipImgView);
}
-(void)setVipImagView:(UIImageView *)vipImagView{
objc_setAssociatedObject(self, &Button_VipImgView, vipImagView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
5.同理把要暴露的开关也与button关联到一起
-(NSString *)shouldShowVip{
return objc_getAssociatedObject(self, &Button_Vip);
}
-(void)setShouldShowVip:(NSString *)shouldShowVip{
objc_setAssociatedObject(self, &Button_Vip, shouldShowVip, OBJC_ASSOCIATION_COPY_NONATOMIC);
CGRect tabFrame = self.frame;
//确定vip位置
NSLog(@"tabFrame=== %@",NSStringFromCGRect(tabFrame));
CGFloat x = tabFrame.size.width;
CGFloat y = tabFrame.size.height;
CGFloat cornerRadius = MIN(x, y) /2;
self.imageView.layer.cornerRadius = cornerRadius;
self.imageView.clipsToBounds = YES;
//这里的位置可以根据需求自己定义
if ([shouldShowVip isEqualToString:@"YES"]) {
self.vipImagView.frame = CGRectMake(x - 16 - 15, y -16, 16, 16);
}else{
self.vipImagView.frame = CGRectZero;
}
}
其实代码并不多,当你看完的时候发现,如果想给 button添加一个角标呢?哈哈, 其实也是这么实现的.
结尾: 我在这里只是抛砖引玉了! 顺便说一句,这是第一次发文(️)...demon地址在最下面.
网友评论