UITextView 在图像附件上时不可滚动
UITextView not scrollable when on image attachment
我有 UITextView
和 attributedString
以及图片附件。 UITextView
不可编辑但可选择。
问题出在图像附件上。当我开始滚动 UITextView
时,触摸(我的手指)开始在图像附件上。它在大多数时候不可滚动。如果我滚动得非常快,它就会起作用。但是如果我用手指按住图像附件,即使持续时间很短,它也不会滚动。
触摸被识别为图像附件上的选择(我移开手指后图像会突出显示)。
我尝试禁用 UITextView
的 isSelectable
属性,问题消失了。但这不是我想要的。我希望它在普通文本上是可选的。
我尝试禁用 UITextView
中的所有 UILongPressGestureRecognizer
,但没有成功。问题依旧。
我能否有一个解决方案,让我可以保持可选状态,同时避免图像附件占用滚动条?提前致谢!
我搞定了。
我假设在UITextView
中,选择是通过UILongPressGestureRecognizer
实现的,滚动是通过UIPanGestureRecognizer
.
实现的
因此,如果我在平移手势失败之前阻止识别长按手势,则长按将不再吃掉滚动条。
首先,我有 UITextView
个子类。在该子类中,在适当的点循环 UIGestureRecognizers
到 UITextView
。我在方法 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
}
}
我有 UITextView
和 attributedString
以及图片附件。 UITextView
不可编辑但可选择。
问题出在图像附件上。当我开始滚动 UITextView
时,触摸(我的手指)开始在图像附件上。它在大多数时候不可滚动。如果我滚动得非常快,它就会起作用。但是如果我用手指按住图像附件,即使持续时间很短,它也不会滚动。
触摸被识别为图像附件上的选择(我移开手指后图像会突出显示)。
我尝试禁用 UITextView
的 isSelectable
属性,问题消失了。但这不是我想要的。我希望它在普通文本上是可选的。
我尝试禁用 UITextView
中的所有 UILongPressGestureRecognizer
,但没有成功。问题依旧。
我能否有一个解决方案,让我可以保持可选状态,同时避免图像附件占用滚动条?提前致谢!
我搞定了。
我假设在UITextView
中,选择是通过UILongPressGestureRecognizer
实现的,滚动是通过UIPanGestureRecognizer
.
实现的
因此,如果我在平移手势失败之前阻止识别长按手势,则长按将不再吃掉滚动条。
首先,我有 UITextView
个子类。在该子类中,在适当的点循环 UIGestureRecognizers
到 UITextView
。我在方法 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
}
}