iOS runtime与扩展的小demon

要迭代新版本了,产品又加需求了...

问题分析:

需求是,在头像上加一个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地址在最下面.


demon地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容