ios cell侧滑删除手势冲突的点击事件和cell的点击事件 冲突怎么解决

博客分类:
转自:http://blog.csdn.net/iosevanhuang/article/details/8830499
今天以前的同事在开发过程中遇到了一个问题,大致描述如下:
他用TableView写了一个登陆界面,帐号和密码两个Cell中加入了TextField。由于想在TableView的空白处点击时收起键盘,所以他注册了一个UITapGestureRecognizer来识别手势。
ViewDidLoad中注册手势的部分代码如下:
UITapGestureRecognizer *oneTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard)] autorelease];
oneTap.delegate =
oneTap.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:oneTap];
其中hideKeyBoard方法就省略了,基本就是几个resignFirstResponder。
然后发生了一个奇怪的现象,点击“找回密码”那一栏时没有反应了!!!
调试后我发现委托方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath不执行了。
目测原因是UITapGestureRecognizer截获了touch事件,导致didSelectRowAtIndexPath方法无法响应。
查阅了相关文档后找到了一种可行的解决方法:重写UIGestureRecognizerDelegate中的
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch方法。
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
NSLog(@"%@", NSStringFromClass([touch.view class]));
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
再次调试,这回didSelectRowAtIndexPath响应了,解决UITapGestureRecognizer手势截获Touch事件的问题!
PS:笔者对Tap手势外其他手势进行了测试,Pinch、Pan、Swipe、Rotation没有产生类似的问题,而Tap和LongPress产生了这样的问题。多谢Doralink提醒,写技术博客还是要写的全面一些。
dcj3sjt126com
浏览: 990125 次
来自: 北京
一个非常棒的系统,要是能支持LDAP等开源认证就完美了。
标签库使用有啥好处呢?
像你最后一句话:批注:至于为什么会有/assets/b729a ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'解决右滑返回手势和UIScrollView中的手势冲突
iOS中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。UIGestureRecognizer和UIView是多对一的关系(),UIGestureRecognizer一定要和view进行绑定才能发挥作用。因此不难想象,UIGestureRecognizer对于屏幕上的手势事件,其接收顺序和UIView的层次结构是一致的
UINavigationController.view && UIViewController.view && UIScrollView && Screen and User's finger
即UIScrollView的panGestureRecognizer先接收到了手势事件,直接就地处理而没有往下传递。
实际上这就是两个panGestureRecognizer共存的问题。
由于scrollView的滑动手势拦截了事件,那我重写scrollView中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return YES;
return NO;
//location_X可自己定义,其代表的是滑动返回距左边的有效长度
- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
int location_X = 100;
if (gestureRecognizer == self.panGestureRecognizer) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureR
CGPoint point = [pan translationInView:self];
UIGestureRecognizerState state = gestureRecognizer.
if (UIGestureRecognizerStateBegan == state || UIGestureRecognizerStatePossible == state) {
CGPoint location = [gestureRecognizer locationInView:self];
if (point.x & 0 && location.x & location_X && self.contentOffset.x &= 0) {
return YES;
return NO;}
需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,scrollView也跟着在滑动呢,我们应该让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return NO;
return YES;
以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。
另外要注意重写的自定义的UIScrollView要记得实现协议UIGestureRecognizerDelegate
scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了。主题 : 给tableviewcell添加长按手势遇到的问题
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
发自: Web Page
给tableviewcell添加长按手势遇到的问题&&&
今天刚刚发现给tableviewcell添加长按手势后,每次长按cell时,长按手势对应的方法会被执行两次&
代码如下 &就是这个longPressedAct函数 &每次都会执行两次 这个执行次数可以控制吗 有哪位朋友能解释一下&
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CustomCellIdentifier];
& & cell.textLabel.text = @"hello world";
& & UILongPressGestureRecognizer *longPressed = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressedAct:)];
& & longPressed.minimumPressDuration = 1;
& & [cell.contentView addGestureRecognizer:longPressed];
-(void)longPressedAct:(id)sender{
//& & if (tabFlag == 0) {
//& & & & NSLog(@"12121");
//& & & & tabFlag = 1;
//& & } else {
//& & & & tabFlag = 0;
//& & }
& & NSLog(@"12121");
级别: 新手上路
可可豆: 110 CB
威望: 6 点
在线时间: 57(时)
发自: Web Page
在&longPressedAct: 方法中对手势的状态进行判断,如果只需要响应一次,可以只在手势状态为began时执行操作
级别: 精灵王
UID: 96152
可可豆: 3763 CB
威望: 2865 点
在线时间: 2780(时)
发自: Web Page
-(void)longPressToDo:(UILongPressGestureRecognizer&*)gesture&&&
&{&&&
&&&&&if(gesture.state&==&UIGestureRecognizerStateBegan)&&&
&&&&&{&&&
&&&&&&&&&CGPoint&point&=&[gesture&locationInView:self.tableView];&&&
&&&&&&&&NSIndexPath&*&indexPath&=&[self.tableView&indexPathForRowAtPoint:point];&&&
&&&&&&&&&if(indexPath&==&nil)&return&;&&&
&&&&&&&&&
&&&&}&&&
&}
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
发自: Web Page
用UITouchPhaseBegan吗??
级别: 新手上路
可可豆: 110 CB
威望: 6 点
在线时间: 57(时)
发自: Web Page
就是下面那位兄台那样判断
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
发自: Web Page
虽然你给的是渔网
下面兄台给的是鱼
考虑到初学者的感受我还是把他设成最佳答案了
级别: 新手上路
可可豆: 110 CB
威望: 6 点
在线时间: 57(时)
发自: Web Page
能帮到你就行
级别: 新手上路
可可豆: 7 CB
威望: 7 点
在线时间: 17(时)
发自: Web Page
请教一个问题,在长按的那个触发方法里面,怎么获取,长按的是那个cell?
级别: 新手上路
UID: 379405
可可豆: 91 CB
威望: 89 点
在线时间: 646(时)
发自: Web Page
回 7楼() 的帖子
gesture.view
级别: 新手上路
可可豆: 7 CB
威望: 7 点
在线时间: 17(时)
发自: Web Page
多谢。。。
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版主题 : 怎么给tableview空白处添加点击事件而不影响cell中的一些按钮的事件
级别: 新手上路
可可豆: 264 CB
威望: 272 点
在线时间: 537(时)
发自: Web Page
来源于&&分类
怎么给tableview空白处添加点击事件而不影响cell中的一些按钮的事件&&&
iOS  怎么给tableview空白处添加点击事件而不影响cell中的一些按钮的事件
级别: 侠客
可可豆: 294 CB
威望: 275 点
在线时间: 289(时)
发自: Web Page
回 楼主(z) 的帖子
用手势解决&&
级别: 侠客
UID: 363673
可可豆: 181 CB
威望: 153 点
在线时间: 834(时)
发自: Web Page
给tableview加点击手势,实现手势的代理,不然点击cell会没有反应。- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {&&&&if ([touch.view isKindOfClass:[UITableView class]]) {&&&&&&&&return YES;&&&&}&&&&&&&&return&&NO;}
级别: 新手上路
可可豆: 264 CB
威望: 272 点
在线时间: 537(时)
发自: Web Page
回 2楼(小包子_01) 的帖子
谢了,这个代理可行的
级别: 新手上路
UID: 479109
可可豆: 27 CB
威望: 21 点
在线时间: 51(时)
发自: Web Page
给力,顺利解决问题。。。。
级别: 侠客
UID: 511133
可可豆: 326 CB
威望: 240 点
在线时间: 266(时)
发自: Web Page
回 4楼(TZSH) 的帖子
怎么用的&&为什么我不走这个方法
级别: 新手上路
可可豆: 16 CB
威望: 16 点
在线时间: 455(时)
发自: Web Page
回 5楼(李志强) 的帖子
你代理设了没。。
级别: 新手上路
UID: 541265
可可豆: 64 CB
威望: 54 点
在线时间: 19(时)
发自: Web Page
遵循tabelView的代理实现下面的方法就行了, 这个是点击cell时的回调函数- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版

我要回帖

更多关于 ios cell按钮点击事件 的文章

 

随机推荐