xcode 缩放后为不同标签设置相同的字体大小

xj3cbfub  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(141)

我正在做一个应用程序,我有3个标签。我正在使用标签自动缩小,以帮助适应标签的字体大小的设备。
这些标签是紧挨着的,这意味着我希望它们的字体大小相同,但现在的情况是(因为它们的文本数量不同)它们最终缩小为不同的字体大小。
有没有一种方法可以使它在缩放后,具有最小字体大小的标签是所有其他标签的标准字体。
谢谢。

mwngjboj

mwngjboj1#

动态调整大小后,可编程地更改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
}

UI标签扩展

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
    }
}

故事板

产出

jtw3ybtb

jtw3ybtb2#

要获得最小的字体大小,可以使用compactMap,然后使用min函数在数组中查找最小的字体大小。
下面是一个示例,说明如何执行此操作:

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
    }
}

相关问题