美文网首页ios实用开发技巧
iOS runtime与扩展的小demon

iOS runtime与扩展的小demon

作者: Heap | 来源:发表于2017-03-03 17:12 被阅读0次

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

    问题分析:

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

    相关文章

      网友评论

        本文标题:iOS runtime与扩展的小demon

        本文链接:https://www.haomeiwen.com/subject/jaszwttx.html