【发布时间】:2014-01-29 16:54:20
【问题描述】:
我有一个禁用的文本视图,上面附加了一个轻击手势识别器。问题是这个手势识别器拦截了所有的点击,包括那些在自动检测到的 URL 上的点击(文本视图打开了数据检测器)。有什么方法可以防止它发生,所以当用户点击一个 URL 时,它由文本视图本身处理(在 Safari 中打开),当用户点击其他地方时,我的手势识别器会被调用?
【问题讨论】:
标签: ios iphone objective-c uitextview
我有一个禁用的文本视图,上面附加了一个轻击手势识别器。问题是这个手势识别器拦截了所有的点击,包括那些在自动检测到的 URL 上的点击(文本视图打开了数据检测器)。有什么方法可以防止它发生,所以当用户点击一个 URL 时,它由文本视图本身处理(在 Safari 中打开),当用户点击其他地方时,我的手势识别器会被调用?
【问题讨论】:
标签: ios iphone objective-c uitextview
最好的方法是如果您可以访问数据检测器使用的手势识别器(然后通过使用委托的gestureRecognizer:shouldRequireFailureOfGestureRecognizer: 等指定您的点击识别器的优先级应该低于那个),但我没有认为这是可能的(如果我错了,任何人都可以在这里纠正我)。
相反,您可以尝试将委托添加到文本视图并检查是否在手势识别器的活动期间调用了textView:shouldInteractWithURL:inRange:(然后仅在UITextView 未处理时才运行您的处理程序)。
【讨论】:
有点hacky,但它有效:
if let recognizers = yourTextView.gestureRecognizers {
for recognizer in recognizers {
if recognizer.name == "UITextInteractionNameLinkTap" {
myCustomTapGestureRecognizer.require(toFail: recognizer)
}
}
}
检测链接的识别器名称为“UITextInteractionNameLinkTap”
【讨论】:
请确保您的文本视图不是其他视图的子视图。 如果是子视图,那么为顶视图添加UITextViewDelegate,然后在viewDidLoad中添加这个:
- (void)viewDidLoad
{
[super viewDidLoad];
yourTextview.delegate = self;
yourTextview.editable = NO;
yourTextview.selectable = YES;
...
}
【讨论】: