iOS-关于一些手势冲突问题(scrollView 嵌套 tableView)
简单说下关于开发中容易遇到的父试图添加手势与子试图点击事件冲突,UIScrollView 嵌套 UIScrollView 、 UIScrollView 嵌套 UITableView的情况手势冲突问题;
点击冲突
如果给现有的基于 UIView 的 xkTestView 上加一个点击手势 gestTap,然后在 xkTestView 中间区域添加一个 tableview,我们想响应 gestTap,同时也想响应 tableview 的 cell 点击代理事件,这时可以添加 gestTap 点击手势代理:
<UIGestureRecognizerDelegate>
然后在点击事件代理方法中实现
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {if ([NSStringFromClass([touch.view class]) isEqualToString:@"xkTestView"]) {return YES;}return NO; }
scrollView 嵌套 tableView 类冲突
这里直接用 scrollView 嵌套 tableView 来处理下滑动时的手势冲突问题,其实苹果并不建议我们这样做,但是在实际项目中,有些需求会经常用嵌套来实现,在什么情况下滑动 tableView 不滑动 scrollView,什么情况下滑动 scrollView 不滑动 tableView,其实如果做其他的嵌套都是一样的,先看下最终效果图:
1)首先新建一个基于 UIScrollView 的 XKBaseScrollView ,并实现 <UIGestureRecognizerDelegate> 代理,XKBaseScrollView 用做主父试图来添加子试图内容
XKBaseScrollView.h
#import <UIKit/UIKit.h>@interface XKBaseScrollView : UIScrollView <UIGestureRecognizerDelegate>@end
XKBaseScrollView.m
#import "XKBaseScrollView.h"@implementation XKBaseScrollView//是否支持多时候触发,这里返回YES -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{return YES; }@end
2)然后新建一个基于 UITableView 的 XKTargetTableView ,并实现 <UIGestureRecognizerDelegate,UITableViewDelegate,UITableViewDataSource> 代理
XKTargetTableView.h
#import <UIKit/UIKit.h>@interface XKTargetTableView : UITableView ///可否滑动 @property (nonatomic,assign) BOOL canSlide; ///滑动block通知 @property (nonatomic,copy) void (^slideDragBlock)(void); @end
XKTargetTableView.m
#import "XKTargetTableView.h" @interface XKTargetTableView ()<UIGestureRecognizerDelegate,UITableViewDelegate,UITableViewDataSource> @property (nonatomic,assign) CGFloat currOffsetY; @end @implementation XKTargetTableView- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style{self = [super initWithFrame:frame style:style];if (self) {self.backgroundColor = [UIColor whiteColor];self.delegate = self;self.dataSource = self;self.tableFooterView = [UIView new];[self registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];}return self; }//是否支持多时候触发,这里返回YES - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{return YES; }#pragma mark ========== tableView 代理 ========== - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return 20; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return 50; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];return cell; }#pragma mark ========== scrollview 代理 ========== - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{_currOffsetY = scrollView.contentOffset.y; }-(void)scrollViewDidScroll:(UIScrollView *)scrollView{if (!self.canSlide) {scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y == 0 ? 0 : _currOffsetY);}_currOffsetY = scrollView.contentOffset.y;if (scrollView.contentOffset.y < 0 ) {self.canSlide = NO;scrollView.contentOffset = CGPointZero;//到顶通知父视图改变状态if (self.slideDragBlock) {self.slideDragBlock();}}scrollView.showsVerticalScrollIndicator = self.canSlide ? YES : NO; } @end
3)最后在使用的 ViewController 中实现
#import "ViewController.h" #import <SDAutoLayout.h>#import "XKBaseScrollView.h" #import "XKTargetTableView.h"@interface ViewController ()<UIScrollViewDelegate> ///容器 @property (nonatomic,strong) XKBaseScrollView *scrollView; @property (nonatomic,strong) XKTargetTableView *tableView; ///是否可以滑动 scrollView @property (nonatomic,assign) BOOL canSlide; @property (nonatomic,assign) CGFloat lastPositionY; ///滑动临界范围值 @property (nonatomic,assign) CGFloat dragCriticalY; @end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib._dragCriticalY = 200;[self.view addSubview:self.scrollView];self.scrollView.sd_layout.topSpaceToView(self.view, 0).leftSpaceToView(self.view, 0).rightSpaceToView(self.view, 0).bottomSpaceToView(self.view, 0);[self.scrollView setupAutoContentSizeWithBottomView:self.tableView bottomMargin:0];__weak __typeof__(self) weekSelf = self;self.tableView.slideDragBlock = ^{weekSelf.canSlide = YES;weekSelf.tableView.canSlide = NO;};}-(void)scrollViewDidScroll:(UIScrollView *)scrollView{CGFloat currentPostion = scrollView.contentOffset.y;/*当 底层滚动式图滚动到指定位置时,停止滚动,开始滚动子视图*/if (currentPostion >= self.dragCriticalY) {scrollView.contentOffset = CGPointMake(0, self.dragCriticalY);if (self.canSlide) {self.canSlide = NO;self.tableView.canSlide = YES;}else{if (_lastPositionY - currentPostion > 0){if (self.tableView.contentOffset.y > 0) {self.tableView.canSlide = YES;self.canSlide = NO;}else{self.tableView.canSlide = NO;self.canSlide = YES;}}}}else{if (!self.canSlide && scrollView.contentOffset.y == self.dragCriticalY ) {scrollView.contentOffset = CGPointMake(0, self.dragCriticalY);}else{if (self.tableView.canSlide &&self.tableView.contentOffset.y != 0) {scrollView.contentOffset = CGPointMake(0, self.dragCriticalY);}else{}}}_lastPositionY = currentPostion; }- (XKBaseScrollView *)scrollView{if (!_scrollView) {_scrollView = [[XKBaseScrollView alloc]init];_scrollView.showsVerticalScrollIndicator = NO;_scrollView.delegate = self;_scrollView.backgroundColor = [UIColor redColor];UIView *view = [[UIView alloc]init];view.backgroundColor = [UIColor blueColor];[_scrollView addSubview:view];view.sd_layout.topSpaceToView(_scrollView, 0).leftSpaceToView(_scrollView, 0).rightSpaceToView(_scrollView, 0).heightIs(300);[_scrollView addSubview:self.tableView];self.tableView.sd_layout.topSpaceToView(view, 0).leftSpaceToView(_scrollView, 0).rightSpaceToView(_scrollView, 0).heightIs(self.view.bounds.size.height - (300 - self.dragCriticalY));}return _scrollView; } - (XKTargetTableView *)tableView{if(!_tableView){_tableView = [[XKTargetTableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain];}return _tableView; } @end
注:此 demo 需引用 SDAutoLayout
转载于:https://www.cnblogs.com/wangkejia/p/11081577.html
iOS-关于一些手势冲突问题(scrollView 嵌套 tableView)相关推荐
- iOS 全屏侧滑手势/UIScrollView/UISlider间滑动手势冲突
七夕节福利 效果预览 一.前期准备 有一个支持全屏侧滑返回的视图控制器ViewController,ViewController.view上有一个UIScrollView,UIScrollView上有 ...
- 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)
在新一期的需求中,产品要求我们做出和美团某个页面类似的功能,即一个页面包含在scrollView中,上面一个部分放置一些常用的广告banner.宫格tab等,下面放置一个RecyclerView用于展 ...
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
/** * 解决ScrollView嵌套ViewPager出现的滑动冲突问题 */ public class ScrollView1 extends ScrollView { private bool ...
- Android之解决ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题
1 问题 ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题 2 解决办法 1).ScrollView替换成普通布局,然后RecycleView用的BaseMultiItem ...
- scrollview嵌套listview 滑动事件冲突的解决方法
scrollview嵌套listview 滑动事件冲突的解决方法 参考文章: (1)scrollview嵌套listview 滑动事件冲突的解决方法 (2)https://www.cnblogs.co ...
- ScrollView 嵌套EditText 滑动冲突解决
ScrollView 嵌套EditText,导致EditText 文字过多,滑动不了. 布局文件: <?xml version="1.0" encoding="ut ...
- ScrollView嵌套ListView冲突问题的最优解决方式
项目做多了之后.会发现事实上ScrollView嵌套ListVew或者GridView等非经常常使用,可是你也会发现各种奇怪问题产生.依据个人经验如今列出常见问题以及代码最少最简单的解决方法. 问题一 ...
- iOS 手势冲突解决思路
2019独角兽企业重金招聘Python工程师标准>>> 贡献者:赵大财 博客:https://my.oschina.net/zhaodacai GitHub:https://gith ...
- [iOS]调和 pop 手势导致 AVPlayer 播放卡顿
作者 NewPan 关注 2017.07.15 14:24* 字数 3110 阅读 749评论 8喜欢 17 声明:我为这个框架写了四篇文章: 第一篇:[iOS]UINavigationControl ...
最新文章
- 基于三层BP神经网络的人脸识别
- R语言list.dirs函数获取目录列表实战
- vlan和如何建立vlan和vconifg
- 【转载】2009年春晚节目单提前揭晓
- 讲讲 Python Launcher 是什么鬼东西?
- ladp3 获取属性_Ldap3库使用方法(四)
- VirtualBox虚拟机配置CentOS7网络图文详解教程
- sql判断时间差值_Oracle判断某人员在某地是否有超过指定时间的停留
- 力扣529.扫雷游戏
- 还在迷茫于前端如何入门和进阶?万字指南让你不再迷茫!
- ATM机为什么不能存100张?
- Linux Shell编程笔记9 SSH和Screen工具
- 【HASPDOG】卸载
- Git简介之部分易混淆命令的简单介绍
- java+selenium键盘操作
- 什么是PBR?pbr入门基础干货
- matlab彩色转灰度图代码,彩色图转灰度图 matlab 实现代码
- U盘再次中毒——U盘文件消失却占内存
- 全程软件测试:非功能性需求
- warning: #231-D: declaration is not visible outside of function
热门文章
- JDK collections - 使用
- 你必须要知道的数据备份工具rsync
- Entity Framework 学习总结之三:架构组成介绍
- 如何导入asl文件?ps制作知识
- 网络管理员的任务与职责
- win7_64 安装 caffe
- Ubuntu20.4安装YouCompleteMe
- 问题 K: n个数的最大值和最小值
- html语言ppt,HTML语言课件.ppt
- BUG解决:RuntimeError:Given groups=1,weight of size...expected input...but got 3 channels instead.