runtime的实际应用以及API设计
2015-12-23 本文已影响412人
乡村武装青年
今天照例撸代码,看到如下设计图.在设计图的上看到有许多的地方都有一个红色提醒标识.于是就想着做一个类似Badge的控件.开始想自定义一个这样的控件,但是发现如果要实现一个类,这样其他已有的视图可复用性太低,最后打算给uiview写一个cagetory.
![](https://img.haomeiwen.com/i980960/ef5ee95dde2d9391.png)
设计API接口的时候就想着如果一个方法里面的参数过多,就会过度设计.但是如果参数太少,可复用性就差.最后决定用 objc_setAssociatedObject 和 objc_setAssociatedObject 来动态的为uiview加上badge这样的属性.
我们都知道,catagory之所以不能给一个类添加属性是因为编译器在最开始就已经分配好了内存,所以无法在添加任何实例变量,但是有了runtime,让一切皆有可能.
具体实现的代码如下:
![](https://img.haomeiwen.com/i980960/a48874d43569add8.png)
![](https://img.haomeiwen.com/i980960/fe8aab3accf5d7f1.png)
![](https://img.haomeiwen.com/i980960/e954fbf3bc72bce9.png)
![](https://img.haomeiwen.com/i980960/d7f028a9dba34ba3.png)
![](https://img.haomeiwen.com/i980960/f0414ce41203d110.png)
![](https://img.haomeiwen.com/i980960/a7b15cb1ff0a9f89.png)
![](https://img.haomeiwen.com/i980960/464bdaaa8a741759.png)
![](https://img.haomeiwen.com/i980960/ef6c76edf1296bc9.png)
![](https://img.haomeiwen.com/i980960/2f9c346981c1edd0.png)
[cellshowBadgeWithStyle:WBadgeStyleNumbervalue:8];
cell.badgeCenterOffset=CGPointMake(-40,22);
![](https://img.haomeiwen.com/i980960/91f3bf7dca379a72.png)
还未解决的问题:如果视图使用autolaoout布局,就无法获得具体frame,badged就无法出现在右上角,只能出现在左上角.