【问题标题】:Adjust UILabel dynamic content to fit text in a particular frame both in width and height using Swift使用 Swift 调整 UILabel 动态内容以适应特定框架中的文本的宽度和高度
【发布时间】:2020-01-31 04:32:12
【问题描述】:

我有一个 UILabel,它显示的文本基本上填满了屏幕。文本可以是一个字母,也可以是多个单词。

private lazy var myLabel: UILabel = {
    let label = UILabel()
    label.textAlignment = .center
    label.baselineAdjustment = .alignCenters

    label.numberOfLines = 0
    label.adjustsFontSizeToFitWidth = true
    label.minimumScaleFactor = 0.1

    let font = UIFont(name: "Arial Rounded MT Bold", size: 400)!
    label.font = font

    return label
}()

它是这样的约束:

self.myLabel.translatesAutoresizingMaskIntoConstraints = false
let leadingConstraint = NSLayoutConstraint(item: self.myLabel, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.myLabel.superview, attribute: NSLayoutConstraint.Attribute.leading, multiplier: 1, constant: 20)
let trailingConstraint = NSLayoutConstraint(item: self.myLabel, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.myLabel.superview, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: -20)
let topConstraint = NSLayoutConstraint(item: self.myLabel, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.myLabel.superview, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 20)
let bottomConstraint = NSLayoutConstraint(item: self.myLabel, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.myLabel.superview, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: -20)
NSLayoutConstraint.activate([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])

标签的宽度正确显示。它动态调整宽度以匹配内容宽度。然而,在某些情况下,在高度中会有一些剪裁。最容易看到的是一个 W 字母。它在宽度上显示很好,但在高度上被剪裁了。

有没有办法让 UILabel 使用 Swift 5 调整字体以适应高度和宽度?

【问题讨论】:

  • 可能会尝试将topAnchor 的常量减少到15 并检查并添加label.numberOfLines = 0
  • 我以前做过,没有区别。
  • 为什么你的底部约束值是-20
  • 您可能想在这里查看答案:stackoverflow.com/questions/9059631/…

标签: ios swift xcode uilabel


【解决方案1】:

多亏了反斜杠-f,我总是使用这个:

import Foundation
import UIKit

class LabelWithAdaptiveTextHeight: UILabel {

    override func layoutSubviews() {
        super.layoutSubviews()
        font = fontToFitHeight()
    }

    private func fontToFitHeight() -> UIFont {

        var minFontSize: CGFloat = 18
        var maxFontSize: CGFloat = 67
        var fontSizeAverage: CGFloat = 0
        var textAndLabelHeightDiff: CGFloat = 0

        while (minFontSize <= maxFontSize) {

            fontSizeAverage = minFontSize + (maxFontSize - minFontSize) / 2

            guard (text?.count)! > 0 else {
              break
            }

            if let labelText: NSString = text as NSString? {
                let labelHeight = frame.size.height

                let testStringHeight = labelText.size(
                    withAttributes: [NSAttributedString.Key.font: font.withSize(fontSizeAverage)]
                ).height

                textAndLabelHeightDiff = labelHeight - testStringHeight

                if (fontSizeAverage == minFontSize || fontSizeAverage == maxFontSize) {
                    if (textAndLabelHeightDiff < 0) {
                        return font.withSize(fontSizeAverage - 1)
                    }
                    return font.withSize(fontSizeAverage)
                }

                if (textAndLabelHeightDiff < 0) {
                    maxFontSize = fontSizeAverage - 1

                } else if (textAndLabelHeightDiff > 0) {
                    minFontSize = fontSizeAverage + 1

                } else {
                    return font.withSize(fontSizeAverage)
                }
            }
        }
        return font.withSize(fontSizeAverage)
    }
}

【讨论】:

  • 这似乎适用于高度,但多行标签的宽度不在框架之外
猜你喜欢
  • 2020-01-02
  • 1970-01-01
  • 2010-10-23
  • 2016-08-01
  • 2015-01-28
  • 2015-04-07
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多