app开发

iOS实现炫酷悬停交互视图

2017-05-13  本文已影响569人  豫风
HHModule.gif

We grow neither better nor worse as we grow old but more like ourselves.( M. L. Becker )
随着年龄的增长,我们并没有变得更好也没有变得更坏,而是变得更象我们自己(贝克尔

下载地址:Github

层级说明:
此控件为UIView,分三个部分,顶部为headerView,setter方法设置,中间的title视图为可以滚动的scrollView,可以设置标题选择和未选择的颜色,底部为collectionView嵌套的tableView,而tableView为用户注册的类名加载而来,需要继承HHBaseTableView,重写父类的一些方法,用户只需要管理headerView和tableView即可,详见Demo.

viewStack.png

该视图包含三个小模块:

传值:

@property (nonatomic, strong) NSMutableDictionary *actionDict;//存储block,给子视图传递事件
AddBlockAction(_hoverView.actionDict, HeaderViewButtonClick, ^(NSString *text){
        
        [wSelf showText:text];
    });
@property (nonatomic, copy)   NSDictionary *dataDict;//需要传递给子视图tableView的字典
@property (nonatomic, copy)   NSArray *dataArray;//需要传递给子视图tableView的数组

用户自定义的tableView只需要重写下面方法即可获得数据

@property (nonatomic, copy)   NSDictionary *dataDict;//子类重写 "setter" 获得数据
@property (nonatomic, copy)   NSArray *dataArray;//子类重写 "setter" 获得数据
@property (nonatomic, strong) NSIndexPath *indexPath;//子类重写"setter" 获得索引

常用方法:

_hoverView.linkageView.titleArray = self.titleArray;//决定中间title的标题
_hoverView.tableViewClassName = NSStringFromClass([HHHoverTableView class]);//注册类名需要继承"HHBaseTableView",加载用户自定义的tableView

知识点:

@property (nonatomic, copy) NSMutableDictionary *dictM;
@property (nonatomic, copy) NSMutableArray *arrayM;

对于以下类型的属性,非一致类型,都会拷贝copy一个不可变对象设置属性,否则直接引用

@property (nonatomic, copy) NSDictionary *dict;
@property (nonatomic, copy) NSArray *array;

copy相对于strong它是安全的,strong为引用性,指针可指向任意对象,造成不安全的访问。

weakassign一个对象销毁时自动赋值nil,一个不会。一般对象解循环引用的时候用weak,而assign常用语基础类型。下面举一个assign不常用到的例子,也是在写此Demo中遇到的。
A对象是一个视图,拥有子视图属性B,子视图B拥有对象属性C,C通过KVO监听B属性的变化。为了保持解耦合,我把B传入C,Cweak引用B设为自己的属性D,在Cdealloc中,让D移除观察者C。

视图层级.png
原则上看是没有任何问题的,实际在演示中发现,B视图会先销毁,而后C才会销毁,当B销毁后,C的属性D也会指向nil,在Cdealloc中,无法移除观察者,导致程序崩溃,此时用assign,却能解决这个问题,虽然B销毁了,C依然可以拿到地址,移除观察者,正常销毁。
最后:

由于本人目前知识储备有限,以上说明中,也许会存在一些错误的描述和认识,还希望发现后你能及时指出,以免误导其他读者,在此谢过。

上一篇下一篇

猜你喜欢

热点阅读