【问题标题】:How to disable Long press gesture recogniser in UITextField and UISearchBar?如何在 UITextField 和 UISearchBar 中禁用长按手势识别器?
【发布时间】:2025-12-05 10:25:02
【问题描述】:

我遇到了很多关于在 UItextView 中禁用长按的帖子,但同样的过程不适用于 UITextField 和 UISearchBar。

有什么方法可以禁用 UITextField 和 UISearchBar 上的长按,这样我就可以避免长按放大镜?

我已经检查了“Disable Magnifying Glass in UITextField”,但解决方案实际上并没有禁用放大镜。它只是不允许粗略地在文本之间移动。但仍显示放大镜。

我想禁用长按 - 以避免Problem 我正面临着放大镜。我现在想禁用它。当我能够解决此问题时,将再次启用它。

【问题讨论】:

  • @Venkat 在这个线程中给出的答案是在苹果批准过程中失败的东西。它使用私有 api。
  • @iOS_devloper 请检查上面链接中接受的答案。那不是私有 api。
  • @Venkat,谢谢,它适用于 UITextField。但我也想为 UISearchbar 禁用它。有什么想法吗?

标签: ios objective-c uitextfield long-press


【解决方案1】:

您可以尝试以下操作以禁用仅内置的长按手势

for (UIGestureRecognizer *recognizer in textView.gestureRecognizers) {
  if ([recognizer isKindOfClass:[UILongPressGestureRecognizer class]]){
    recognizer.enabled = NO;
  }
}

所有人的委托方法:-

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
return NO;
}

【讨论】:

  • 如果我会从 shouldChangeCharactersInRange 返回 NO,它将不允许我在文本字段中进行编辑。
  • 如果您需要编辑,则只能通过第一种方法禁用长按手势
  • 删除长按手势适用于 TextField 但不适用于 UISearchbar。
【解决方案2】:

自定义类中的这种组合是我唯一能够为我工作的东西,并且在第一次长按时有时仍会出现放大镜:

//swift 4.2
override func addGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer)
{

    if gestureRecognizer.isKind(of: UILongPressGestureRecognizer.self)
    {
        print(gestureRecognizer.name.unwrappedDebugString)
        gestureRecognizer.isEnabled = false
    }
    return super.addGestureRecognizer(gestureRecognizer)
}
override func becomeFirstResponder() -> Bool
{
    for recognizer in self.gestureRecognizers ?? []
    {
        if (recognizer is UILongPressGestureRecognizer)
        {
            recognizer.isEnabled = false
        }
    }
    return super.becomeFirstResponder()
}

【讨论】:

    【解决方案3】:

    @Neeraj 在 Swift 4 中的回答:

    class CustomTextView: UITextView {
    
       override func addGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer) {
    
         if gestureRecognizer.isKind(of: UILongPressGestureRecognizer.self) {
                  gestureRecognizer.isEnabled = false
         }
        return super.addGestureRecognizer(gestureRecognizer)
       }
    }
    

    【讨论】:

    • 在iOS 12中,如果文本字段是第一响应者,那么在长按完成后放大镜仍然会出现并迅速消失,中断touchUpInside。
    【解决方案4】:

    一个好的和干净的方法是你可以为 UITextField 创建一个自定义类,在自定义类中你可以覆盖导致放大视图出现的长按手势。 这个自定义类可以在我们不想显示测试字段放大视图的所有地方使用。只需使用下面的类代替 UITextField 类

    class CustomTextView: UITextView {
    
        override func addGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
            if (gestureRecognizer.isKindOfClass(UILongPressGestureRecognizer)) {
                gestureRecognizer.enabled = false;
            }
            super.addGestureRecognizer(gestureRecognizer)
            return
        }
    }
    

    【讨论】: