首页 > 解决方案 > UITextInteraction + UIScrollView

问题描述

我有一个采用 UITextInput 协议的自定义文本输入视图。此视图嵌入在 UIScrollView 中。采用视图的 UITextinput 包括 UITextInteraction。当我将选择句柄拖到当前可见区域的边缘(顶部或底部)时,视图应自动滚动并选择文本(如 UITextView)。有谁知道如何实现这一目标?

我希望 UITextInteraction 可以通过它的委托通知我必要的事件,但它没有(甚至自动处理这个功能)。

我试图拦截最近的Position(指向:CGPoint)-> UITextPosition?,每当用户触摸 UITextInput 采用视图时都会调用它。因此,我可以使用它来跟踪选择手柄的拖动操作。有一次,用户到达视图的顶部,我向上滚动。但是,我无法检测到用户何时松开手柄(触摸结束时)。发生这种情况时,scrollView 应该停止滚动。就我而言,滚动视图一直滚动到顶部。

我还尝试拦截 selectionRects(for range: UITextRange) -> [UITextSelectionRect],但在滚动过程中偶尔会调用它。

我也无法检测到 touchesEnded()。UITextInteraction 似乎阻止了调用。此外,我无法实现自己的平移手势。UITextInteraction 在选择操作期间也会阻止这一点。

有人成功使用过 UITextInteraction 吗?在这个阶段,它似乎非常不成熟。

标签: iosuitextinput

解决方案


这是我从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
}

推荐阅读