簡體   English   中英

如何滾動到UITextField中的最后一個字符?

[英]How to scroll to last character in UITextField?

我試圖從Apple的“Phone”應用程序重建UITextField

我構建了一個小鍵盤,每個按鈕觸發一個特定值(0-9,#,*)並將其附加到文本字段的文本中。

textAlignment屬性設置為center 但是,插入數字時,文本字段不會滾動或移動到最后一個字符。 F.ex.,如果有超過10個數字並且我正在添加第11個數字,則不會顯示該數字,因為它不在屏幕上。

Apple通過首先縮小字體大小然后滾動到光標位置來處理此問題。

是否有一個簡單的技巧來實現相同的結果?

我附上了兩張照片。

在此輸入圖像描述

在此輸入圖像描述

在此輸入圖像描述

使用此示例。 將光標和滾動設置到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)
}

您需要在storyboard中設置文本視圖的最小字體大小,並選中它下面的adjust to fit復選框。

在此輸入圖像描述

為什么使用文本字段而不是使用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
        }
    }

在viewcontroller中使用此代碼段可在文本增加時縮小文本。

func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    myTextField.minimumFontSize = 4.0
    myTextField.setNeedsLayout()
    myTextField.layoutIfNeeded()
}

雖然我不喜歡回答我自己的問題,但由於我剛剛找到解決方案,似乎沒有辦法解決。

Alastar部分正確; 而不是使用UITextField ,使用UILabel更簡單。

但是,對我來說這個技巧的單行是設置換行模式來截斷頭部:

label.lineBreakMode = .byTruncatingHead

這條路,

顯示該行以使末尾適合容器,並且行開頭的缺失文本由省略號字形表示。 雖然此模式適用於多行文本,但它更常用於單行文本。

這是Apple在其“電話”應用程序(撥號屏幕)中使用的確切行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM