在我的iPhone应用程序我有一个消息屏幕。 我已经加入UITapGestureRecognizer
在UIViewController
,也是我有一个UITableview
在屏幕上。 我想选择UITableViewCell
,但我不能选择UITableView
因为UITapGestureRecognizer
。 当我触摸屏幕时,只有敲击手势动作叫做但是UITableView
委托didSelectRowAtIndexPath:
不叫。 任何人都可以请帮我在这两个点触手势和工作UITableView:didSelectRowAtIndexPath:
。 提前致谢。
Answer 1:
虽然我更喜欢马特·迈耶的建议或我使用自定义的手势识别器,另一种解决方案,不涉及定制手势识别的其他建议,将有水龙头手势识别器识别你是否拍了拍你的tableview中的单元格,如果是的话,手动调用didSelectRowAtIndexPath
,例如:
- (void)handleTap:(UITapGestureRecognizer *)sender
{
CGPoint location = [sender locationInView:self.view];
if (CGRectContainsPoint([self.view convertRect:self.tableView.frame fromView:self.tableView.superview], location))
{
CGPoint locationInTableview = [self.tableView convertPoint:location fromView:self.view];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:locationInTableview];
if (indexPath)
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
return;
}
// otherwise proceed with the rest of your tap handling logic
}
因为如果你正在做什么复杂的与你的tableview(例如,在单元格编辑,自定义控制等),你失去了这种行为,这是最理想的,但如果你只是希望收到didSelectRowAtIndexPath
,那么这可能做的工作。 其他两种方法(独立观点或自定义手势识别),让你保留完整的tableview的功能,但是这可能是工作,如果你只是需要一些简单,你不需要的tableview中的内置功能的其余部分。
Answer 2:
您可以使用TagGesture委托:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isDescendantOfView:yourTableView]) {
return NO;
}
return YES;
}
希望这可以帮助。
Answer 3:
一个简单的方法来做到这一点是有两种观点:一个包含要点击手势要上来看,和包含的tableview之一。 你可以附上UITapGestureRecognizer到你想要的工作的看法,然后它不会阻止你的UITableView。
Answer 4:
假设你想点击手势,除了在tableview中工作无处不在,你可以继承点击手势识别,创造一个识别器会忽略包含在一个阵列中的任何子视图excludedViews
,防止它们产生一个成功的手势(因此将它传递给didSelectRowAtIndexPath
或其他):
#import <UIKit/UIGestureRecognizerSubclass.h>
@interface MyTapGestureRecognizer : UITapGestureRecognizer
@property (nonatomic, strong) NSMutableArray *excludedViews;
@end
@implementation MyTapGestureRecognizer
@synthesize excludedViews = _excludedViews;
- (id)initWithTarget:(id)target action:(SEL)action
{
self = [super initWithTarget:target action:action];
if (self)
{
_excludedViews = [[NSMutableArray alloc] init];
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
CGPoint location = [[touches anyObject] locationInView:self.view];
for (UIView *excludedView in self.excludedViews)
{
CGRect frame = [self.view convertRect:excludedView.frame fromView:excludedView.superview];
if (CGRectContainsPoint(frame, location))
self.state = UIGestureRecognizerStateFailed;
}
}
@end
然后,当你要使用它,只需指定要排除什么控制:
MyTapGestureRecognizer *tap = [[MyTapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[tap.excludedViews addObject:self.tableView];
[self.view addGestureRecognizer:tap];
文章来源: How get UITableView IndexPath from UITableView iphone?