美文网首页app开发
iOS实现炫酷悬停交互视图

iOS实现炫酷悬停交互视图

作者: 豫风 | 来源:发表于2017-05-13 15:05 被阅读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

    该视图包含三个小模块:

    • BaseConstruct :可选8中waitHud样式,提醒文字,错误页面;
    • RefreshManager :包含三种刷新样式,KVO监听,使用简单;
    • LinkageView :指示器联动

    传值:

    • 事件传递
      传值方式为:KVC字典传值,控制器定义Block,以key值区分事件,保存在HHHoverLinkageViewactionDict中,父视图负责分发到各个子视图,子视图各个以key值获得自己需要调用的Blcok。
    @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
    

    知识点:

    • 1tableViewcontentOffset实际上就是它的bounds,只需要在scrollViewDidScroll中时时改变为0,即是:scrollView.contentOffset = CGPointZero就可以控制它父视图的坐标,同时加上一系列的边界监测,就可实现上述效果。
    • 2 :关键字copyassignweakstrong的灵活运用
      对于以下两种是没有太多意义的,每次赋值都会copy一个不可变对象设置属性,如果使用插入删除编译时不会报错,但运行时会导致崩溃。
    @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依然可以拿到地址,移除观察者,正常销毁。
    最后:

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

    相关文章

      网友评论

      本文标题:iOS实现炫酷悬停交互视图

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