如何禁用UITextField和UISearchBar控件中的长按手势识别器?

3

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

有没有办法禁用UITextField和UISearchBar上的长按,以便我可以避免长按放大镜?

我已经检查过 " Disable Magnifying Glass in UITextField" ,但是那里给出的解决方案实际上并没有禁用放大镜。它只是不允许光标在文本之间移动。但仍然显示放大镜。

我想禁用长按-以避免问题,我面临着放大镜的困扰。我现在想禁用它。在我能够解决这个问题之后,我会再次启用它。


2
请查看此链接:https://dev59.com/70fRa4cB1Zd3GeqP-ZdG - Anbu.Karthik
请参考以下链接:https://dev59.com/QGgv5IYBdhLWcg3wYv2i - Venk
@Venkat在这个线程中给出的答案使用了私有API,因此无法通过苹果的审核过程。 - PlusInfosys
1
@iOS开发者,请检查上面链接中的被接受的答案。那不是私有API。 - Venk
@Venkat,谢谢,它对于UITextField有效。但我也想禁用UISearchbar。有什么想法吗? - PlusInfosys
显示剩余2条评论
4个回答

2
您可以尝试以下方法来禁用仅内置的长按手势:
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,它将不允许我在文本字段中进行编辑。 - PlusInfosys
如果您需要进行编辑,则仅通过第一种方法禁用长按手势。 - Tanvi Jain
删除长按手势对于TextField是有效的,但对于UISearchbar却无效。 - PlusInfosys

0

在自定义类中,这种组合是我唯一能够让它正常工作的方法,在第一次长按时,有时仍会出现放大镜:

//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()
}

-1

@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事件的执行。使用此代码可以解决该问题。 - A. L. Strine

-2

一个好的、干净的实现方式是创建一个自定义的UITextField类,在这个自定义类中覆盖长按手势,这样就可以防止出现放大视图。

在所有不需要展示测试文本框放大视图的地方都可以使用这个自定义类来代替UITextField类。

class CustomTextView: UITextView {

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接