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, который вы бы создали для взаимодействия со ссылками.

Другие вопросы по тегам