我使用故事板构建了一个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]];
}
有谁知道解决方案?感谢
答案 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
}