而不是增加的手勢識別器到每個單獨的小區,則可以添加一個到表視圖,確定從用戶觸摸的點被選擇哪個小區,然後確定用戶是否觸摸了圖像或細胞。
首先確保你的控制器採用UIGestureRecognizerDelegate協議。
@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end
然後添加UIGestureRecognizer
到UITableView
當視圖負載。
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.delegate = self;
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[self.tableView addGestureRecognizer:singleTap];
}
該代表方法確定是否應該執行handleTap:
方法。如果它可以從用戶touch中找到indexPath
,則它返回YES
,否則返回NO
。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
UITableView *tableView = (UITableView *)gestureRecognizer.view;
CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
if ([tableView indexPathForRowAtPoint:p]) {
return YES;
}
return NO;
}
一旦如果用戶已經點擊在細胞中我們已確定,則handleTap:方法被調用,然後決定是否用戶觸摸的圖像,或細胞的任何其他部分。
- (void)handleTap:(UITapGestureRecognizer *)tap
{
if (UIGestureRecognizerStateEnded == tap.state) {
UITableView *tableView = (UITableView *)tap.view;
CGPoint p = [tap locationInView:tap.view];
NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p];
[tableView deselectRowAtIndexPath:indexPath animated:NO];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CGPoint pointInCell = [tap locationInView:cell];
if (CGRectContainsPoint(cell.imageView.frame, pointInCell)) {
// user tapped image
} else {
// user tapped cell
}
}
}
對於那些不知道。 'viewDidLoad'中的所有'UITapGestureRecognizer'設置也可以在Xcode UI佈局(又名IB)中完成。你需要將'handleTap:'的返回類型改爲'IBAction'。 – ThomasW