在不禁用上下文菜单的情况下管理长按UITextfiled?
我有UITableView,它的单元格有一个UITextField。
现在我在UITextField中添加了长手势,但它无法正常工作。 当我在文本字段上点击长手势时,它总是显示上下文菜单(选择,复制剪切,过去等)。
我的问题是如何在UITextFiled中管理长手势和上下文菜单。
我试过下面的代码:
longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; longGesture.minimumPressDuration = 2.0; //seconds longGesture.delegate = self; -(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { CGPoint p = [gestureRecognizer locationInView:self.tableView]; NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; if (indexPath == nil) { NSLog(@"long press on table view but not on a row"); } else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { NSLog(@"long press on table view at row %ld", indexPath.row); } else { NSLog(@"gestureRecognizer.state = %ld", gestureRecognizer.state); } }
Tableview委托方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Note *obj = [self.dataArr objectAtIndex:indexPath.row]; TableViewCell *Cell = [self.tableView dequeueReusableCellWithIdentifier:@"cell"]; if (Cell == nil) { Cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; Cell.selectionStyle = UITableViewCellSelectionStyleNone; } else{ Cell.memoField.text = obj.memoRowText; } Cell.memoField.userInteractionEnabled = YES; [Cell.memoField addGestureRecognizer:longGesture]; Cell.memoField.delegate = self; Cell.memoField.tag = indexPath.row; return Cell; }
您需要在显示上下文菜单的手势和长按手势之间设置失败要求。 具体来说,您需要菜单识别器要求您长按失败(即您需要菜单识别器等到它排除了长按)。 在代码中,一种方法是实现此委托方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)longPress shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)other { if (other.view /* is a text field in the table view */) { return YES; } else { return NO; } }
这些方法可能有点令人困惑。 请记住,您可以使用-[UIGestureRecognizer requireGestureRecognizerToFail:]
添加“静态”故障要求,但在许多情况下,您不必轻易地引用两个识别器(例如在这种情况下)。 在许多情况下,这就足够了。 但是,手势识别器系统还为您提供了“即时”安装故障要求的机会。
从-gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:
返回YES -gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:
具有与调用[second requireFailureOfGestureRecognizer:first]
相同的效果(其中first
和second
是该方法的第一个和第二个参数)。
OTOH从-gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
返回YES -gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
具有与调用[first requireFailureOfGestureRecognizer:second]
相同的效果。