1

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

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

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

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

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

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

4

2 回答 2

0

这是我从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
}
于 2020-03-29T13:41:44.680 回答
0

我找到了解决我原来问题的方法。这是一种解决方法,但希望 Apple 会改进 UITextInteraction。

试图拦截 UITextInput 中的任何函数都无济于事。谢天谢地,Twitter 上的一些非常聪明的人想出了该怎么做。您需要拦截自动添加的正确 UIGestureRecognizer。就像西蒙在他的回答中解释的那样。有问题的识别器称为 UITextRangeAdjustmentGestureRecognizer。但是您无法通过gesturesForFailureRequirements 找到它。您需要成为手势的代表,然后您可以通过 shouldRecognizeSimultaneouslyWith otherGestureRecognizer 的委托方法找到提到的手势。

向该手势添加目标 + 动作后,您可以观察拖动和处理边缘滚动。

于 2020-06-13T17:10:43.137 回答