如何根据标签可用的高度调整UILabel字体大小

Ica*_*aro 3 ios autolayout swift

我正在使用自动布局和使用UILables调整文本大小,并且它在宽度上工作得很好,但在高度上却没有那么多.

如果宽度中的文本有空格但文本没有压缩高度

任何想法如何创建约束来做到这一点?或者这是不可能的,我怎样才能找到适合矩形的文本的最小尺寸?

tym*_*mac 7

您可以将字体设置为自动填充标签的大小,也可以选择不低于最小字体大小.只需将adjustsFontSizeToFitWidth设置为YES即可.如果您需要更多信息,请查看UILabel类参考.

虽然布尔值被称为"adjustsFontSizeToWidth",但它实际上意味着标签高度的最大尺寸,它将保留在标签的一行(或者指定的行数).

Subclassed UILabel并覆盖layoutSubviews.然后每次UILabel更改其大小时,都会重新计算字体大小:

import Foundation
import UIKit

class LabelWithAdaptiveTextHeight: UILabel {

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

// Returns an UIFont that fits the new label's height.
private func fontToFitHeight() -> UIFont {

    var minFontSize: CGFloat = DISPLAY_FONT_MINIMUM // CGFloat 18
    var maxFontSize: CGFloat = DISPLAY_FONT_BIG     // CGFloat 67
    var fontSizeAverage: CGFloat = 0
    var textAndLabelHeightDiff: CGFloat = 0

    while (minFontSize <= maxFontSize) {
        fontSizeAverage = minFontSize + (maxFontSize - minFontSize) / 2

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

            let testStringHeight = labelText.sizeWithAttributes(
                [NSFontAttributeName: font.fontWithSize(fontSizeAverage)]
            ).height

            textAndLabelHeightDiff = labelHeight - testStringHeight

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

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

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

            } else {
                return font.fontWithSize(fontSizeAverage)
            }
        }
    }
    return font.fontWithSize(fontSizeAverage)
}
}
Run Code Online (Sandbox Code Playgroud)


Kun*_*rma 5

Swift 3.0适合任何新人来到这里.

非常感谢@tymac的原始答案.

在让我的应用程序通用时,真的帮助我不用担心文本大小.

import UIKit
import Foundation

class LabelWithAdaptiveTextHeight: UILabel {

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

    // Returns an UIFont that fits the new label's height.
    private func fontToFitHeight() -> UIFont {

        var minFontSize: CGFloat = 20
        var maxFontSize: CGFloat = 250
        var fontSizeAverage: CGFloat = 0
        var textAndLabelHeightDiff: CGFloat = 0

        while (minFontSize <= maxFontSize) {
            fontSizeAverage = minFontSize + (maxFontSize - minFontSize) / 2

            if let labelText: String = text {
                let labelHeight = frame.size.height

                let testStringHeight = labelText.size(attributes: [NSFontAttributeName: 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)
    }
}
Run Code Online (Sandbox Code Playgroud)