iOS实现炫酷悬停交互视图

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.

iOS实现炫酷悬停交互视图_第1张图片
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。

iOS实现炫酷悬停交互视图_第2张图片
视图层级.png

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

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

warning 此版本有一些BUG,可作为参考,建议使用简化版
collectionview嵌套tableview实现悬停交互

你可能感兴趣的:(iOS实现炫酷悬停交互视图)