iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置

Posted

技术标签:

【中文标题】iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置【英文标题】:iOS Added programmatically UITextField does not scroll text to cursor position while editing 【发布时间】:2018-02-10 21:00:07 【问题描述】:

我以编程方式添加了 UITextFields。这是一个例子:

addingItemView = UIView(frame: CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight))
let itemNameTextField = UITextField(frame: CGRect(x: 20, y: 40, width: textFieldWidth, height: 20))
itemNameTextField.becomeFirstResponder()
itemNameTextField.placeholder = NSLocalizedString("itemName", comment: "")
itemNameTextField.keyboardType = .default
itemNameTextField.autocorrectionType = .no
itemNameTextField.backgroundColor = UIColor.white
itemNameTextField.layer.cornerRadius = 3
itemNameTextField.borderStyle = .roundedRect
itemNameTextField.clearButtonMode = .whileEditing
itemNameTextField.addTarget(self, action: #selector(assignValueToItemName), for: .editingDidEnd)

addingItemView.addSubview(itemNameTextField)

问题是:当用户输入的字符数超过 UITextField 长度时,文本不会像默认情况下那样水平滚动到左侧,这是在 Storyboard 中添加的 UITextFields。所以用户无法看到他在那里输入的内容。

我试图在 UITextField 类和情节提要检查器中找到相应的属性 - 不走运。在这里检查了一些答案,例如this,但无法找到如何滚动文本。

不好的例子(光标不可见,但它是屏幕截图问题,因为它在闪烁):

很好的例子(在 Storyboard 中添加了 TextField,光标不可见,但这是截图问题,因为它在闪烁):

请告知我在这里缺少什么?我应该实现 EditingChanged 方法并以编程方式滚动文本吗?我试过了,但不明白该怎么做。我想将光标移动到位置不是一回事。

【问题讨论】:

你试过在代码中添加约束吗??? 不,我没有...会尝试,谢谢。 【参考方案1】:

如果 textField 的高度小于文本字体大小,则 textField 不会滚动到光标位置。

【讨论】:

【参考方案2】:

试试这个

addingItemView.addSubview(itemNameTextField)
itemNameTextField.translatesAutoresizingMaskIntoConstraints = false
itemNameTextField.widthAnchor.constraint(equalToConstant: textFieldWidth).isActive = true
itemNameTextField.heightAnchor.constraint(equalToConstant: 20).isActive = true
itemNameTextField.leadingAnchor.constraint(equalTo: addingItemView .leadingAnchor, constant: 20).isActive = true
itemNameTextField.topAnchor.constraint(equalTo: addingItemView .topAnchor, constant:40).isActive = true

【讨论】:

感谢您的帮助,您的代码是有效的,但给了我相同的结果。我突然找到了原因......我将身高从 20 改为 25,它开始按预期工作。不知道为什么会这样,但确实发生了。【参考方案3】:

通过将高度大小从 20 增加到 25 解决了我的特定问题。很可能是因为 ios 无法调整文本,因为字体大小和文本字段高度。

let itemNameTextField = UITextField(frame: CGRect(x: 20, y: 40, width: textFieldWidth, height: 25))

【讨论】:

以上是关于iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView

如何以编程方式将标记 (UIControl) 添加到 UITextField 或 SearchBar?

以编程方式添加带有约束的 UITextField

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?

以编程方式向UITextField添加约束

以编程方式创建 UITextField 事件