ios - UITextInteraction + UIScrollView
问题描述
我有一个采用 UITextInput 协议的自定义文本输入视图。此视图嵌入在 UIScrollView 中。采用视图的 UITextinput 包括 UITextInteraction。当我将选择句柄拖到当前可见区域的边缘(顶部或底部)时,视图应自动滚动并选择文本(如 UITextView)。有谁知道如何实现这一目标?
我希望 UITextInteraction 可以通过它的委托通知我必要的事件,但它没有(甚至自动处理这个功能)。
我试图拦截最近的Position(指向:CGPoint)-> UITextPosition?,每当用户触摸 UITextInput 采用视图时都会调用它。因此,我可以使用它来跟踪选择手柄的拖动操作。有一次,用户到达视图的顶部,我向上滚动。但是,我无法检测到用户何时松开手柄(触摸结束时)。发生这种情况时,scrollView 应该停止滚动。就我而言,滚动视图一直滚动到顶部。
我还尝试拦截 selectionRects(for range: UITextRange) -> [UITextSelectionRect],但在滚动过程中偶尔会调用它。
我也无法检测到 touchesEnded()。UITextInteraction 似乎阻止了调用。此外,我无法实现自己的平移手势。UITextInteraction 在选择操作期间也会阻止这一点。
有人成功使用过 UITextInteraction 吗?在这个阶段,它似乎非常不成熟。
解决方案
这是我从UITextInteraction
文本插入点放置中获取此信息的方式。我还没有尝试跟踪选择句柄,但如果我管理它会更新答案
UITextInteraction
有一个名为 的属性gesturesForFailureRequirements
。如果您转储这些内容,您会注意到一个UIVariableDelayLoupeGesture
名为UILongPressGestureRecognizer
. 当用户用手指“拾起”光标时,这是我们想要的
在添加文本交互时,我将自己的目标/选择器添加到此手势识别器中,如下所示:
for gesture in interaction.gesturesForFailureRequirements {
if gesture.isKind(of: UILongPressGestureRecognizer.self) {
gesture.addTarget(self, action: #selector(longPressEdgeScrollGesture(_:)))
}
}
然后,longPressEdgeScrollGesture
您可以在滚动视图中获取光标的坐标,以根据需要激活边缘滚动计时器
@objc private func longPressEdgeScrollGesture(_ gesture: UILongPressGestureRecognizer) {
guard gesture.numberOfTouches > 0 else {
return
}
let location = gesture.location(in: gesture.view)
print(location)
//Start/stop your edge scrolling as required
}
推荐阅读
- javascript - 使用 Javascript 在 Internet Explorer 中打开应用程序/八位字节流 (pdf)
- javascript - 如何“通过单击它关闭的模态外部”来停止碳设计组件中模态元素的默认行为?
- django-rest-framework - 在 DRF 中可以批量创建吗?
- ansible - 如果我创建了多个实例,如何在 wait_for 模块中使用 with_items?
- openlayers - getFeaturesAtPixel() 包括整理(隐藏)的特征
- jenkins - 如何为 Jenkins 声明式管道中的步骤创建方法?
- python - 使用 GlobalObjectives 库中的损失时出错
- python - 我想在 python 3 的文本文件中搜索列表元素
- javascript - 当我的网站*打开*位置时,如何修改模式的文本/描述?
- java - Glassfish 找不到 taglib 的 setter 方法