UITableView无法通过单个手势识别器进行触摸

时间:2015-02-05 00:34:02

标签: ios objective-c uitableview uiscrollview

我有一个带有UITextField,UIButton和UITable视图的UIView。文本字段和按钮会破坏搜索栏,然后将结果加载到表格视图中。

我想让它们键盘解散。如果用户在编辑文本字段时点击某些内容。我的策略是为UIView添加一个手势识别器,但是后来手势识别器似乎拦截了表视图中的所有触摸并且你| tableView:didSelectCellAtIndexPath:|永远不会被召唤。有趣的是(至少对我来说)是当用户正在编辑字段时UIButton仍然可以使用,即使UITableView不是。

我尝试过实施| gestureRecognizer :: shouldRecognizeSimultaneouslyWithGestureRecognizer:|总是回归是的,但这并没有帮助。我也试过设置

singleTapRecognizer.cancelsTouchesInView = NO;

也没有帮助。

我很满意在文本字段调用时添加和删除手势识别器的想法| textFieldDidBeginEditing:|和| textFieldDidFinishEditing:|,虽然这感觉很麻烦但是当您编辑文本字段时仍然需要两次点击才能触摸单元格(一个用于关闭它们键盘并删除识别器,一个用于点击单元格)。 / p>

有更好的方法吗?

以下相关代码:

- (void)loadView {
  [super loadView];

  self.scrollView = [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].bounds];
  self.scrollView.backgroundColor = [FDEColors viewBackgroundColor];
  self.view = self.scrollView;

  self.searchField = [[UITextField alloc] initWithFrame:CGRectZero];
  self.searchField.placeholder = @"What are you looking for?";
  self.searchField.backgroundColor = [FDEColors textFieldBackgroundColor];
  self.searchField.clipsToBounds = YES;
  self.searchField.layer.borderColor = [[FDEColors buttonColor] CGColor];
  self.searchField.layer.borderWidth = 1.f;
  self.searchField.returnKeyType = UIReturnKeySearch;
  self.searchField.delegate = self;
  [self.view addSubview:self.searchField];

  self.searchButton = [[UIButton alloc] initWithFrame:CGRectZero];
  self.searchButton.backgroundColor = [FDEColors buttonColor];
  [self.searchButton setTitle:@"Search" forState:UIControlStateNormal];
  [self.searchButton addTarget:self
                        action:@selector(searchPressed:)
              forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:self.searchButton];

  self.resultsTableView =
      [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
  self.resultsTableView.delegate = self;
  self.resultsTableView.dataSource = self;
  self.resultsTableView.backgroundColor = [FDEColors viewBackgroundColor];
  [self.resultsTableView setSeparatorInset:UIEdgeInsetsZero];
  self.resultsTableView.layoutMargins = UIEdgeInsetsZero;
  [self.resultsTableView registerClass:[FDESearchResultsCell class]
                forCellReuseIdentifier:[FDESearchResultsCell reuseIdentifier]];
  [self.view addSubview:self.resultsTableView];

  self.singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                     action:@selector(dismissKeyboard)];
  [self.view addGestureRecognizer:self.singleTapRecognizer];
}

- (void)dismissKeyboard {
  [[self view] endEditing:YES];
}

1 个答案:

答案 0 :(得分:0)

尝试实现手势识别器的委托方法:

- (BOOL) gestureRecognizer:ShouldReceiveRouch:

在此方法中,检查触摸的位置。如果它在tableview中,则返回no,因此tableview可以接收触摸。否则,返回YES并让识别器处理触摸。

编辑:尽管识别器存在,但接收触摸的按钮仍然存在,从iOS6开始,Apple决定在识别手势时优先使用按钮和其他控件。它仅适用于对抗手势,在您的情况下只需轻击一下。例如,如果您还有一个平移识别器,则识别器将具有优先权,而不是按钮。

编辑2:

上述方法的示例实现:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// Determine if the touch is inside the custom subview
if ([touch view] == self.yourTableView){
    // If it is, prevent all of the delegate's gesture recognizers
    // from receiving the touch
    return NO;
}
return YES;

}

相关问题