在Xcode 9和iOS 11之前,我在UITextView
内有一个包含多个链接的UITableViewCell
。每个链接都按预期工作,但自升级到iOS 11和Xcode 9后,链接不再有效。
UITextView似乎无法识别与func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
从未触发的任何触摸交互。
升级后有没有其他人发现同样的问题?
答案 0 :(得分:3)
事实证明,毕竟没有问题。 UITextView响应iOS11中触摸的方式的变化意味着单击链接需要更多的按下而不仅仅是以前在iOS10中工作的点击。我认为这可能与以下事实有关:在iOS11中,您现在可以按链接并拖动它们,这也会显示URL的详细信息。因此,UITextView需要更加坚固的按下才能注册被点击的链接。
答案 1 :(得分:0)
特别是在iOS 11.0和11.1中(不是在11.2+中,而不是在10.x中更早),来自UITextViewDelegate的textView(_:shouldInteractWith:in:interaction)
是通过与UILongPressGestureRecognizer
而不是{{1}的交互来调用的}。
对于这两个iOS版本,用户需要小延迟长按而不是点击,以便与UITextView链接进行本机交互。
如果对于这两个iOS版本的回调没有被称为 >>,即使长时间按下,你也可能通过继承你的UITextView来搞乱手势识别器在不应该UITapGestureRecognizer
的情况下重写gestureRecognizerShouldBegin(_)
。
以下是false
的快速部分解决方法的示例,它将禁用放大镜/放大镜长按(如果这是所需的意图)覆盖),但仍允许长按链接:
gestureRecognizerShouldBegin(_)
另一种方法是完全禁止override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer is UIPanGestureRecognizer {
// required for compatibility with isScrollEnabled
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer,
tapGestureRecognizer.numberOfTapsRequired == 1 {
// allowing taps for links
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer,
// allowing small delay long press for links (required for iOS 11.0-11.1)
// average comparison value is used to distinguish between:
// 0.12 (smallDelayRecognizer)
// 0.5 (textSelectionForce and textLoupe)
longPressGestureRecognizer.minimumPressDuration < 0.325 {
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
gestureRecognizer.isEnabled = false
return false
}
和UILongPressGestureRecognizer
,除了您自己构建的自制UITapGestureRecognizer以与链接进行交互。