Xcode 9 UITextView ссылки больше не кликабельны
До Xcode 9 и iOS 11 у меня был UITextView
в пределах UITableViewCell
который содержал несколько ссылок. Каждая ссылка работала должным образом, однако после обновления до iOS 11 и Xcode 9 ссылки больше не работают.
UITextView, кажется, не распознает какое-либо сенсорное взаимодействие с func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
никогда не стреляет.
Кто-нибудь еще обнаружил такую же проблему после обновления?
2 ответа
Оказывается, проблем не было в конце концов. Изменения в том, как UITextView реагирует на прикосновения в iOS11, означают, что для перехода по ссылкам требуется больше нажатия, а не просто прикосновение, которое ранее работало в iOS10. Я думаю, что это может быть связано с тем, что в iOS11 теперь вы можете нажимать ссылки и перетаскивать их, что также отображает детали URL. Таким образом, более жесткое нажатие необходимо для UITextView, чтобы зарегистрировать нажатую ссылку.
В частности, в iOS 11.0 и 11.1 (не позднее в 11.2+, не ранее в 10.x), textView(_:shouldInteractWith:in:interaction)
из UITextViewDelegate вызывается из взаимодействия с UILongPressGestureRecognizer
вместо UITapGestureRecognizer
,
Для этих двух версий iOS пользователю требуется небольшая задержка, долгое нажатие вместо нажатия для нативного взаимодействия со ссылками UITextView.
Если обратный вызов вообще не вызывается для этих двух версий iOS, даже при длительном нажатии, вы, вероятно, возитесь с распознавателями жестов, создав подкласс UITextView и переопределив 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
за исключением самодельного UITapGestureRecognizer, который вы бы создали для взаимодействия со ссылками.