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.

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依然可以拿到地址,移除观察者,正常销毁。
最后:

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,216评论 30 472
  • 十里桃花 那是一个桃花盛开的季节,院子里的几株桃树托起一片花海,洁白的桃花一朵紧挨着一朵,挤满了整个枝丫。有...
    陈流阅读 1,002评论 0 4
  • 听信狡性,纵放心猿 当家才知柴米价,养子方晓父娘恩 徐步幽林 蛇头上的苍蝇,自来的衣食 藤攀葛绕,柏翠松青 花草俱...
    笑乐吗阅读 1,394评论 0 0
  • ....
    小絔阅读 192评论 0 1