我在iOS9中遇到了UITextview的问题,当我在textview上进行长按时它会显示放大镜。我试图通过UILongPressGestureRecognizer禁用它,它也完全禁用链接和手机触摸事件。
如何仅禁用放大镜。
override func addGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
if gestureRecognizer .isKindOfClass(UILongPressGestureRecognizer){
gestureRecognizer.enabled = false
}
super.addGestureRecognizer(gestureRecognizer)
}
textview将位于collectionview单元格中。
有一种方法可以实现这一目标。只需覆盖gestureRecognizerShouldBegin
的UITextView
。该手势识别器对象即将开始处理触摸以确定其手势是否正在发生。唯一棘手的部分是正确识别分配给放大镜激活的委托。
我已成功测试:UITextGestureClusterLoupe
。这是工作示例(Swift 4):
override public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
{
if let gestureDelegate = gestureRecognizer.delegate {
if(gestureDelegate.description.localizedCaseInsensitiveContains("UITextGestureClusterLoupe"))
{
return false;
}
}
return true;
}
代码似乎正确,但您需要覆盖textView的gestureRecognizer
,而不是超类。将super.addGestureRecognizer(gestureRecognizer)
更改为yourTextView.addGestureRecognizer(gestureRecognizer)
并将其放置在包含文本视图出口的视图控制器中(如果它已经存在)。
根据Vlada的回复,对于我的代码,我发现分配给放大镜激活的代表是“UITextLoupeInteraction”
这是我的代码:
open override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if let gestureDelegate = gestureRecognizer.delegate {
print(gestureDelegate.description)
if(gestureDelegate.description.localizedCaseInsensitiveContains("_UIKeyboardBasedTextSelectionInteraction")){
return false
}
if(gestureDelegate.description.localizedCaseInsensitiveContains("UITextLoupeInteraction")){
return false
}
}
return true
}
我的开发环境:swift4,Xcode10.1,iOS 12.1