我试图通过Apple的“电话”应用重建UITextField
。
我构建了一个数字键盘,其中每个按钮都会触发某个值(0-9,#,*),并将其附加到文本字段的文本中。
textAlignment
属性设置为center
。但是,在插入数字时,文本字段不会滚动或移动到最后一个字符。
例如,如果有10个以上的数字,而我要添加第11个数字,则该数字将不会显示,因为它不在屏幕上。
Apple通过首先缩小字体大小,然后滚动到光标位置来解决此问题。
是否有一个简单的技巧即可达到相同的结果?
我附上了两张图片。
答案 0 :(得分:0)
使用此示例。设置光标并滚动到UITextField
的末尾。由于您要使用UI进行操作,因此必须在主线程中完成
DispatchQueue.main.async {[weak self] in
self?.textField.becomeFirstResponder() // to focuse on this UITextField
let newPosition = self?.textField.endOfDocument ?? UITextPosition()
self?.textField.selectedTextRange = self?.textField.textRange(from: newPosition, to: newPosition)
}
答案 1 :(得分:0)
答案 2 :(得分:0)
为什么使用文本字段而不使用uilabel?
使用
可以轻松解决label.adjustsFontSizeToFitWidth = true
label.textAlignment = .center
label.setFillSuperview(withPadding: UIEdgeInsets(top: 0, left: whatYouNeed, bottom: 0, right: whatYouNeed))
并将扩展名添加到UIView
extension UIView {
func setFillSuperview(withPadding padding: UIEdgeInsets = .zero) {
translatesAutoresizingMaskIntoConstraints = false
if let superviewLeadingAnchor = superview?.leadingAnchor {
leadingAnchor.constraint(equalTo: superviewLeadingAnchor, constant: padding.left).isActive = true
}
if let superviewTrailingAnchor = superview?.trailingAnchor {
trailingAnchor.constraint(equalTo: superviewTrailingAnchor, constant: -padding.right).isActive = true
}
if let superviewBottomAnchor = superview?.bottomAnchor {
bottomAnchor.constraint(equalTo: superviewBottomAnchor, constant: -padding.bottom).isActive = true
}
if let superviewTopAnchor = superview?.topAnchor {
topAnchor.constraint(equalTo: superviewTopAnchor, constant: padding.top).isActive = true
}
}
答案 3 :(得分:0)
在您的视图控制器中使用此代码段可在文本增加时缩小文本。
func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
myTextField.minimumFontSize = 4.0
myTextField.setNeedsLayout()
myTextField.layoutIfNeeded()
}
答案 4 :(得分:0)
尽管我不喜欢回答自己的问题,但是由于我刚刚找到了解决方案,所以似乎没有办法。
Alastar部分正确;与使用UITextField
相比,使用UILabel
更为简单。
但是,对我有用的单行是设置换行模式以截断头部:
label.lineBreakMode = .byTruncatingHead
这样
将显示该行,以使其末端适合容器,并且以省略号字形指示该行开头的丢失文本。尽管此模式适用于多行文本,但更常用于单行文本。
这是Apple在其“电话”应用程序(拨号屏幕)中使用的确切行为。