UITableView 和 UIView 手势冲突
UITableView and UIView gesture conflict
我正在尝试在 UIView
中添加 UITableView
,但手势识别器出现问题。这是我的代码:
_subView = [[UIView alloc] initWithFrame:CGRectMake(0, screenRect.size.height-100, screenRect.size.width, 300)];
_subView.backgroundColor = [UIColor colorWithRed:0.110f green:0.192f blue:0.298f alpha:1.00f];
[self.view addSubview:_subView];
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subViewToggle)];
[_subView addGestureRecognizer:singleFingerTap];
_moreTable = [[UITableView alloc] initWithFrame:CGRectMake(0,50, screenRect.size.width, 240)];
//Transforme to HOR scroll ;
CGRect frame = _moreTable.frame;
_moreTable.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle);
_moreTable.frame = frame;
[_moreTable registerNib:[UINib nibWithNibName:@"MoreTableViewCell" bundle:nil] forCellReuseIdentifier:@"moreCell"];
_moreTable.backgroundColor = [UIColor groupTableViewBackgroundColor];
_moreTable.delegate = self;
_moreTable.dataSource = self;
[_subView addSubview:_moreTable];
[_subView bringSubviewToFront:_moreTable];
问题是当我单击 table 单元格而不是执行 didSelectRowAtIndexPath
方法时,他执行了 subViewToggle
方法。我试着把我的 tableView
放在前面,但没用
你的点击手势吃掉了触摸。有两种交易方式:
首先,您可以实现 - gestureRecognizer:shouldReceiveTouch:
委托方法,并决定是否应该出现点击手势。
其次,你也可以将tap的cancelsTouchesInView
属性设置为NO,这样tableView才会接收到touch。但点击也会在某个时候收到触摸。
尝试实施 UIGestureRecognizerDelegate 协议的 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
这应该同时调用您的 didSelectRow 和 GestureRecognizer
请尝试这样使用
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view == _moreTable]) {
return NO;
}
return YES;
}
为了解决这个问题,我将 UIView 手势从单指点击更改为 moveUP 和 moveDown 手势。
请注意,我只尝试了@dharmbir 解决方案,但对我没有用。
更新 此外,此解决方案实现了 shouldReciveTouches
,适用于 tapGesture 和她的代码片段:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// UITableViewCellContentView => UITableViewCell
if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
return NO;
}
// UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
return NO;
}
return YES;
}
//Create tap gesture for menu transparent view
UITapGestureRecognizer *rightTableTransparentViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rightTableTransparentViewTapMethod:)];
[rightTableTransparentViewTap setCancelsTouchesInView:NO];
[_rightTableTransparentView addGestureRecognizer:rightTableTransparentViewTap];
- (void)rightTableTransparentViewTapMethod:(UITapGestureRecognizer *)recognizer {
//Write your code here
}
我正在尝试在 UIView
中添加 UITableView
,但手势识别器出现问题。这是我的代码:
_subView = [[UIView alloc] initWithFrame:CGRectMake(0, screenRect.size.height-100, screenRect.size.width, 300)];
_subView.backgroundColor = [UIColor colorWithRed:0.110f green:0.192f blue:0.298f alpha:1.00f];
[self.view addSubview:_subView];
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subViewToggle)];
[_subView addGestureRecognizer:singleFingerTap];
_moreTable = [[UITableView alloc] initWithFrame:CGRectMake(0,50, screenRect.size.width, 240)];
//Transforme to HOR scroll ;
CGRect frame = _moreTable.frame;
_moreTable.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle);
_moreTable.frame = frame;
[_moreTable registerNib:[UINib nibWithNibName:@"MoreTableViewCell" bundle:nil] forCellReuseIdentifier:@"moreCell"];
_moreTable.backgroundColor = [UIColor groupTableViewBackgroundColor];
_moreTable.delegate = self;
_moreTable.dataSource = self;
[_subView addSubview:_moreTable];
[_subView bringSubviewToFront:_moreTable];
问题是当我单击 table 单元格而不是执行 didSelectRowAtIndexPath
方法时,他执行了 subViewToggle
方法。我试着把我的 tableView
放在前面,但没用
你的点击手势吃掉了触摸。有两种交易方式:
首先,您可以实现 - gestureRecognizer:shouldReceiveTouch:
委托方法,并决定是否应该出现点击手势。
其次,你也可以将tap的cancelsTouchesInView
属性设置为NO,这样tableView才会接收到touch。但点击也会在某个时候收到触摸。
尝试实施 UIGestureRecognizerDelegate 协议的 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
这应该同时调用您的 didSelectRow 和 GestureRecognizer
请尝试这样使用
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view == _moreTable]) {
return NO;
}
return YES;
}
为了解决这个问题,我将 UIView 手势从单指点击更改为 moveUP 和 moveDown 手势。
请注意,我只尝试了@dharmbir 解决方案,但对我没有用。
更新 此外,此解决方案实现了 shouldReciveTouches
,适用于 tapGesture 和她的代码片段:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// UITableViewCellContentView => UITableViewCell
if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
return NO;
}
// UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
return NO;
}
return YES;
}
//Create tap gesture for menu transparent view
UITapGestureRecognizer *rightTableTransparentViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rightTableTransparentViewTapMethod:)];
[rightTableTransparentViewTap setCancelsTouchesInView:NO];
[_rightTableTransparentView addGestureRecognizer:rightTableTransparentViewTap];
- (void)rightTableTransparentViewTapMethod:(UITapGestureRecognizer *)recognizer {
//Write your code here
}