使用Swift中的Word Wrapping自动调整Multiline UILabel

问题描述 投票:1回答:2

我有一个UILabels的集合视图,它受限于容器单元格的宽度和高度。每个UILabel都有可自定义的文本。我希望这个文本缩小和自动换行,以便以尽可能大的尺寸拟合文本。我已经尝试过许多线程,在objc中读取解决方案,但没有任何作用。我无法弄清楚这一点。我们在这里看到的只是Truncate Tail的最小字体大小,它应该可以正常工作,但是它会继续被削减,我无法弄清楚原因。

有人给我一些提示吗?我已经尝试了一些编程解决方案,但到目前为止还没有任何工作。

这就是我得到的:

What I am getting

这就是我要的:

What I want

swift uilabel multiline word-wrap autosize
2个回答
1
投票

我遇到了同样的问题。我为UILabel创建了一个扩展来处理这个问题。您可以尝试根据您的需求进行调整。

func adjustFontSizeToWidth() {

        enum Constants {
            static let fontDecrement: CGFloat = 1.0
            static let minimumFontSize: CGFloat = 6.0
        }

        var characterSet = CharacterSet.whitespacesAndNewlines
        characterSet.insert(charactersIn: "-")
        let words = text?.components(separatedBy: characterSet)

        var largestWord = ""
        var largestWordWidth: CGFloat = 0

        words?.forEach { word in
            let wordSize = (word as NSString).size(withAttributes: [NSAttributedString.Key.font: font])
            let wordWidth = wordSize.width

            if wordWidth > largestWordWidth {
                largestWordWidth = wordWidth
                largestWord = word
            }
        }

        while largestWordWidth > bounds.width && font.pointSize > Constants.minimumFontSize {
            font = font.withSize(font.pointSize - Constants.fontDecrement)
            let largestWordSize = (largestWord as NSString).size(withAttributes: [NSAttributedString.Key.font: font])
            largestWordWidth = largestWordSize.width
        }
    }

但是当你在上面调用adjustFontSizeToWidth()时,请确保标签有适当的界限。例如,您可以覆盖layoutSubviews()


-1
投票

这可能对你有用

var label = UILabel()
label.text = "Harvard Hills" // "Willis 7", "Arbs"
label.numberOfLines = 2
label.lineBreakMode = .byWordWrapping
label.minimumScaleFactor = 0.6 . // Important - set minimum scale factor

// Now an answer to your question
let numOflines = label.numberOfLines

现在,使用视图控制器中的layoutSubviewslayoutIfNeeded刷新标签,并使用行数减小字体大小。

if numOflines > 1 {
     label.font = // reduce font size (by 4 or 8 points)
}

这是结果(我在那里创建了可设计的标签和设置条件):

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.