簡體   English   中英

縮放后為不同的標簽設置相同的字體大小

[英]Setting the same font size for different labels AFTER scaling

我正在制作一個有 3 個標簽的應用程序。 我正在使用 label 自動縮小來幫助使標簽的字體大小適應設備。

這些標簽彼此相鄰,因此這意味着我希望它們具有相同的字體大小。 目前發生的情況是(因為它們有不同數量的文本)它們最終縮小到不同的字體大小。

有沒有辦法讓它在縮放后,最小字體的 label 是所有其他標簽的標准字體。

謝謝。

動態調整大小后以編程方式更改UIlabel字體大小。 請參閱下面的示例。 使用字符串和字體的長度計算當前字體大小。 然后獲得最小字體大小並單獨申請每個UILabel

override func viewWillAppear(_ animated: Bool) {
    let fontSize1 = self.label1.getFontSizeForLabel()
    let fontSize2 = self.label2.getFontSizeForLabel()
    let fontSize3 = self.label3.getFontSizeForLabel()

    let smallestFontSize = min(min(fontSize1, fontSize2), fontSize3)

    self.label1.font = self.label1.font.withSize(smallestFontSize)
    self.label2.font = self.label2.font.withSize(smallestFontSize)
    self.label3.font = self.label3.font.withSize(smallestFontSize)

    self.label1.adjustsFontSizeToFitWidth = false
    self.label2.adjustsFontSizeToFitWidth = false
    self.label3.adjustsFontSizeToFitWidth = false
}

UILabel擴展

extension UILabel {
    func getFontSizeForLabel() -> CGFloat {
        let text: NSMutableAttributedString = NSMutableAttributedString(attributedString: self.attributedText!)
        text.setAttributes([NSAttributedStringKey.font: self.font], range: NSMakeRange(0, text.length))
        let context: NSStringDrawingContext = NSStringDrawingContext()
        context.minimumScaleFactor = self.minimumScaleFactor
        text.boundingRect(with: self.frame.size, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: context)
        let adjustedFontSize: CGFloat = self.font.pointSize * context.actualScaleFactor
        return adjustedFontSize
    }
}

故事板

在此輸入圖像描述

產量

在此輸入圖像描述

要獲得最小的字體大小,您可以使用compactMap 然后,您可以使用 min function 來查找數組中的最小字體大小。

這是您如何執行此操作的示例:

        let labels = mainContainer
            .arrangedSubviews
            .compactMap { $0 as? UILabel }

        let newFontsSize = labels.map { label in
            var fontSize = label.font.pointSize
            
            while label.isTruncated {
                fontSize -= 0.25
                label.font = label.font.withSize(fontSize)
            }

            return fontSize
        }

        if let smallestFontSize = newFontsSize.min() {
            labels.forEach { label in
                label.font = label.font.withSize(smallestFontSize)
            }
        }

和擴展名:

extension UILabel {
    var isTruncated: Bool {
        frame.width < intrinsicContentSize.width
    }
}

暫無
暫無

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

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