16

我有一个使用情节提要构造的 UITextField 。我不想让用户更改光标的位置并将其始终保持在文本末尾的文本字段中。

我试图在达阵事件中更改光标的位置,但是在选择文本字段,然后通过再次触摸文本字段来更改光标的位置时,该位置会更改:

- (IBAction)amountBoxTouchDown:(id)sender {
    UITextPosition *start = [amountBox positionFromPosition:[amountBox beginningOfDocument] offset:amountBox.text.length];
    UITextPosition *end = [amountBox positionFromPosition:start
                                                   offset:0];
    [amountBox setSelectedTextRange:[amountBox textRangeFromPosition:start toPosition:end]];
}

有谁知道解决方案?谢谢

4

7 回答 7

31

只需创建 UITextField 的子类并覆盖最接近的PositionToPoint方法:

- (UITextPosition *)closestPositionToPoint:(CGPoint)point{
    UITextPosition *beginning = self.beginningOfDocument;
    UITextPosition *end = [self positionFromPosition:beginning offset:self.text.length];
    return end;
}

现在用户将无法移动光标,它将始终位于字段的末尾。

迅速:

override func closestPosition(to point: CGPoint) -> UITextPosition? {
    let beginning = self.beginningOfDocument
    let end = self.position(from: beginning, offset: self.text?.count ?? 0)
    return end
}
于 2014-05-28T19:02:28.657 回答
7

在文本字段成为第一响应者后禁用任何手势识别器。这允许它接收初始点击,但阻止用户在它是第一响应者时与该字段交互。这保持了将光标保持在文本末尾而不允许用户覆盖它的系统行为。

在 UITextField 子类中,添加以下内容:

斯威夫特 3.1:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    return !isFirstResponder
}

在情节提要中,将文本字段的类更改为 UITextField 子类。

于 2017-06-15T20:52:27.810 回答
5

如果您对始终将光标保持在文本末尾感兴趣,请执行以下操作:

override func closestPosition(to point: CGPoint) -> UITextPosition? {
    return self.endOfDocument
}
于 2018-01-21T19:56:16.663 回答
2

将层和控件视为可以组合以实现功能的工具。

如果您只是在 UITextField 上方放置一个 UIButton 并将按钮类型更改为自定义,则可以防止文本字段上的所有触摸事件,例如移动光标、选择文本、复制、剪切和粘贴。

默认情况下,自定义按钮是透明的。

创建一个动作,以便在触摸按钮时,文本字段成为第一响应者。

于 2013-05-07T13:09:16.887 回答
1

好的,您要做的是隐藏一个 UITextField。

将该隐藏的文本字段添加到视图中,并在其上调用 becomeFirstResponder。从你的amountBoxTouchDown:方法。

在 Textfield 委托中,获取用户输入的文本并将其添加到amountBox.text. 同时关闭userInteractionEnabled可见的 amountBox 文本字段。

这会产生您想要的效果。

查看一些示例代码Link

于 2013-05-07T12:38:02.407 回答
1

@kas-kad 解决方案的扩展。我用这个创建了一个 UITextView 的子类

var enableCursorMotion = true

override func closestPosition(to point: CGPoint) -> UITextPosition? {
    if enableCursorMotion {
        return super.closestPosition(to: point)
    }
    else {
        let beginning = self.beginningOfDocument
        let end = self.position(from: beginning, offset: (self.text?.count)!)
        return end
    }
}
于 2017-12-01T17:53:49.603 回答
0

为什么不使用textFieldDidChangeSelectionfrom 的方法UITextFieldDelegate

通过以下实现,光标始终位于最后。

而且您不必创建 UITextField 的子类

func textFieldDidChangeSelection(_ textField: UITextField) {
        let position = textField.endOfDocument
        textField.selectedTextRange = textField.textRange(from: position, to: position)
}

这样做的一个缺点是您无法标记文本,甚至无法查看带有选择、粘贴等选项的菜单。

于 2022-01-11T23:58:50.317 回答