阻止用户在UITextField上设置光标位置

时间:2013-05-07 12:29:45

标签: iphone ios objective-c

我使用故事板构建了一个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]];
}

有谁知道解决方案?感谢

6 个答案:

答案 0 :(得分:18)

只需创建UITextField的子类并覆盖 nearestPositionToPoint 方法:

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

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

SWIFT:

override func closestPosition(to point: CGPoint) -> UITextPosition? {
    let beginning = self.beginningOfDocument
    let end = self.position(from: beginning, offset: self.text?.count ?? 0)
    return end
}

答案 1 :(得分:4)

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

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

SWIFT 3.1:

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

在故事板中,将文本字段的类更改为UITextField子类。

答案 2 :(得分:2)

好的,你要做的就是拥有一个隐藏的UITextField。

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

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

这会产生你想要的效果。

查看一些示例代码Link

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:0)

@ 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
    }
}

答案 5 :(得分:0)

如果您有兴趣始终将光标放在文本的末尾,请执行以下操作:

override func closestPosition(to point: CGPoint) -> UITextPosition? {
    return self.endOfDocument
}