Отрегулируйте содержимое UILabel dynamici c, чтобы оно соответствовало тексту в определенном кадре как по ширине, так и по высоте, используя Swift - PullRequest
0 голосов
/ 31 января 2020

У меня есть 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?

1 Ответ

1 голос
/ 31 января 2020

Я всегда использую это благодаря backsla sh -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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...