如何滚动到UITextField中的最后一个字符?

时间:2019-04-16 09:09:06

标签: ios swift uitextfield

我试图通过Apple的“电话”应用重建UITextField

我构建了一个数字键盘,其中每个按钮都会触发某个值(0-9,#,*),并将其附加到文本字段的文本中。

textAlignment属性设置为center。但是,在插入数字时,文本字段不会滚动或移动到最后一个字符。 例如,如果有10个以上的数字,而我要添加第11个数字,则该数字将不会显示,因为它不在屏幕上。

Apple通过首先缩小字体大小,然后滚动到光标位置来解决此问题。

是否有一个简单的技巧即可达到相同的结果?

我附上了两张图片。

enter image description here

enter image description here

enter image description here

5 个答案:

答案 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)

您需要在情节提要中为文本视图设置最小字体大小,然后选中其下方的“调整以适合”复选框。

enter image description here

答案 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在其“电话”应用程序(拨号屏幕)中使用的确切行为。