UITextView 在图像附件上时不可滚动

UITextView not scrollable when on image attachment

我有 UITextViewattributedString 以及图片附件。 UITextView 不可编辑可选择

问题出在图像附件上。当我开始滚动 UITextView 时,触摸(我的手指)开始在图像附件上。它在大多数时候不可滚动。如果我滚动得非常快,它就会起作用。但是如果我用手指按住图像附件,即使持续时间很短,它也不会滚动。
触摸被识别为图像附件上的选择(我移开手指后图像会突出显示)。

我尝试禁用 UITextViewisSelectable 属性,问题消失了。但这不是我想要的。我希望它在普通文本上是可选的。

我尝试禁用 UITextView 中的所有 UILongPressGestureRecognizer,但没有成功。问题依旧。

我能否有一个解决方案,让我可以保持可选状态,同时避免图像附件占用滚动条?提前致谢!

我搞定了。

我假设在UITextView中,选择是通过UILongPressGestureRecognizer实现的,滚动是通过UIPanGestureRecognizer.
实现的 因此,如果我在平移手势失败之前阻止识别长按手势,则长按将不再吃掉滚动条。

首先,我有 UITextView 个子类。在该子类中,在适当的点循环 UIGestureRecognizersUITextView。我在方法 didMoveToSuperview().

中做到了
override func didMoveToSuperview() {
    if let grs = gestureRecognizers {
        for gr in grs {
            if gr.isKind(of: UIPanGestureRecognizer.self) {
                // set delegate
                gr.delegate = self
            }
        }
    }
}

其次,从 UIGestureRecognizerDelegate 协议实现方法 gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool

extension CustomTextView: UIGestureRecognizerDelegate {    
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        // all UILongPressGestureRecognizer has to wait UIPanGestureRecognizer to be failed before recognized
        if gestureRecognizer.isKind(of: UIPanGestureRecognizer.self) && otherGestureRecognizer.isKind(of: UILongPressGestureRecognizer.self) {
            return true
        }
        return false
    }
}

Reference from apple.com