【问题标题】:Autosize Multiline UILabel with Word Wrapping in Swift在 Swift 中使用自动换行自动调整多行 UILabel
【发布时间】:2017-07-05 00:03:47
【问题描述】:

我有一个集合视图,其中包含受限于其容器单元格的宽度和高度的 UILabel。每个 UILabel 都有可自定义的文本。 我希望此文本缩小并自动换行,以使文本尽可能大。我尝试了很多很多线程,在 objc 中阅读了解决方案,但没有任何效果。我想不通。我们在这里看到的只是 Truncate Tail 的最小字体大小,它应该可以工作,但那个 'd' 一直被剪掉,我不知道为什么。

有人给我一些建议吗?我已经尝试了一些编程解决方案,但到目前为止都没有奏效。

这是我得到的:

这就是我想要的:

【问题讨论】:

    标签: swift uilabel multiline word-wrap autosize


    【解决方案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()

    【讨论】:

    • 很好,很好用!此外,如果您在单元格等可重用元素中使用标签,请不要忘记在分配新文本之前重置字体大小。
    【解决方案2】:

    这可能对你有用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多