发布网友 发布时间:2022-12-24 06:37
共1个回答
热心网友 时间:2023-09-17 13:56
1、UIScrollView上有两个子控件UITableView(分别称作table1,table2)水平布局,作为左右滑动的分页
2、第一个UITableView的cell元素支持左滑弹出删除按钮删除和可选择删除功能
1、table1元素左滑时UIScrollview会将该手势捕获导致左滑删除按钮不显示
2、进入编辑模式table1需要有可以选择的功能,table1编辑模式下的cell选中和不选中的图片需要替换
3、左滑删除的图片需要替换
4、ios11之前和ios11之后cell的删除左滑删除按钮弹出后层级有变化
1、创建UIScrollView的拓展类,并重写shouldRecognizeSimultaneouslyWithGestureRecognizer方法,该方法返回YES表示手势向下传递
开始左滑时需要让uiscrollView不能滚动,结束删除编辑后需要让uiscrollview能够滚动。开始左滑和结束删除编辑会回调下面两个方法,beginEditingBlock和endEditingBlock分别是禁止滚动和允许滚动方法。
点击右上角编辑按钮tableview进入编辑状态,此时可以多选cell
此时可以响应tableview的didselect和didDeselect方法,用NSMutableSet数组保存是否选中的元素index,在显示的时候根据是否选中显示我们自定义的图片
实现editActionsForRowAtIndexPath回调,编辑左滑按钮数组,可以实现多个左滑按钮,此处只实现删除按钮
ios11之前,可以在自定义的cell里实现layoutsubviews方法,找到删除按钮控件并替换图片。到了ios11之后左滑cell删除按钮的视图层级已经不在cell里面,所以不能用此方法去重新设置删除按钮图片
我们来看下左滑时cell的层级,以项目中聊天元素McChatCell左滑为例,测试机ios10的左滑cell层级:
UITableViewCellActionButton是左滑出现的按钮层级,它在MCChatCell的层级下面,是UITableViewCellActionButton这个视图。
测试机ios13的左滑cell层级:
ios11之后左滑导致整个cell被包裹在UITableViewCellSwipeContainerView这个控件里面,UISwipeActionStandardButton是左滑出现的删除按钮视图。
明显可以看到左滑出删除按钮时测试机ios10系统删除按钮在自定义cell层级内,但是测试机ios13的删除按钮层级和自定义cell处于同一层层级,所以ios11之后不能使用重写自定义cell的layoutsubviews方式去修改删除按钮的图片。
ios11之后可以直接实现uitableview的代理trailingSwipeActionsConfigurationForRowAtIndexPath便可以实现删除图片的自定义
做这个模块功能踩了很多坑,主要是uitableview的代理和一些处理方法在系统升级后有了改动,cell左滑后层级也有变化,在修改删除按钮和多选按钮图片的方式也要做响应修改。而且table的一些代理方法达到的效果有重叠,比如trailingSwipeActionsConfigurationForRowAtIndexPath和editActionsForRowAtIndexPath实现点击删除按钮方法,但是trailingSwipeActionsConfigurationForRowAtIndexPath只有在ios11之后才有效,而且如果不实现editActionsForRowAtIndexPath这个方法cell左滑也不会出现删除按钮效果,所以ios11之后这两个方法都需要实现,这些很容易让人迷惑