UITableView嵌入UIScrollView,左滑手势冲突和多选删除问题
发布网友
发布时间: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之后这两个方法都需要实现,这些很容易让人迷惑
UITableView嵌入UIScrollView,左滑手势冲突和多选删除问题
1、UIScrollView上有两个子控件UITableView(分别称作table1,table2)水平布局,作为左右滑动的分页 2、第一个UITableView的cell元素支持左滑弹出删除按钮删除和可选择删除功能 1、table1元素左滑时UIScrollview会将该手势捕获导致左滑删除按钮不显示 2、进入编辑模式table1需要有可以选择的功能,table...
ios scollview 嵌套tableview,怎么识别cell的左滑手势
当你把scrollView滑到最边上(左或右)的时候,当你继续做滑想要让cell接收左滑手势的时候,这时滑动删除的事件被底部的UIScrollview给响应了,cell根本拿不到这个滑动手势。tableView是UIScrollview 的子类,cell里面的ContentView好像在iOS7.0之后也是UIScrollview ,再加底部一个UIScrollview,这滑动手势事...
iOS手势冲突(JXCategoryView滚动手势与侧滑、UITableView又划删除)
看到这个我就知道怎么弄了,咱们可以自定义一个自定义UIScrollView或UICollectionView 在里面实现手势的控制,我这里初始化 [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self] 因此需要自定义一个 UIScorllView 来控制手势,让它兼容多种手势共存 1.Servi...
调整UITableView手势跟随页面整体滑动总结
1、判断滑动的 ListView 的frame的y值是否已经超出规定范围,超出就不再处理滑动,我的实现是小于0就不再处理滑动。2、tableview的偏移量必须是小于0的这也才能处理滑动,不然会造成 tableview 和 listview 一起滑动的效果,很不自然。上面1、2条件必须放在一起使用,才能保证滑动手势和 view 本身的手势...
为什么把uitableview视图增加到uiscrollview视图上出错
http://rralun.blog.163.com/blog/static/103904296201311123030667/ 最近优化工程,遇到一个很棘手的问题,就是uitableview的内容视图下移,如图所示 ios7 uitableview内容视图下移 - Ameast - Dream 我左右两个tableview设置的起始坐标是一样的,但是相对于右边tableview而言,左边的tableview的内容视图明显...
tableView嵌套tableView 支持左右滑动 上下联动
详细内容:我是需要做一个像iphone上 空间主页面那个效果:但是 空间里好像是用整个一张uiscrollview实现的但我想利用重用机制,在下面用一个scrollView,然后scrollView里加一个TableView所以这里就有一个上下滑事件重叠的问题创建的时候,tableView.frame=(0,200,320,460);并且tableView的上下滑动事件交给...
如何在ScrollView滑动的瞬间禁用拖拽手势
在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug.复制代码/// ViewController.m// TableViewDemo/// Created by XianMingYou on 15/2/23.// Copyright (c) 2015年 XianMingYou. All rights reserved.//#import "ViewController.h"@interface View...
UIScrollView及其子类的嵌套联动
如果用UICollectionView实现,当手动滚动索引指示器,当把选中的索引滚出屏幕显示范围,再点选别的,此时可能会产生由于复用引发的崩溃和选中状态错乱,要进行判空处理,swift中可以设置cell为Optional可选型类型。该控制器内的滚动视图可以是UIScrollView,也可以是UITableView,就可以将整个containerView部分添加...
UITableView和UICollectionView实现自定义滚动动画
首先我们先实现实际动画的类 ScrollViewAnimator 。我们用OC的runtime知识动态为分类添加属性方便使用 动画缓冲函数的实现可以参考 http://robertpenner.com/easing/ 。具体实现例子在 Demo 中 http://robertpenner.com/easing/ https://blog.csdn.net/S_clifftop/article/details/89490422 https://zs...
UIPanGestureRecognizer和UIScrollView冲突了 怎么破
把下面这段加进去 //解决cell手势和uitableview下滑的冲突 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { // Find the...