Как найти фактическое количество строк UILabel?

Как я могу найти фактическое количество строк a UILabel после того, как я инициализировал его с a text и a font? Я установил numberOfLines свойство к 0, таким образом, это расширится до однако многих строк, необходимы. Но затем, как я могу узнать, сколько строк это наконец добралось после того, как я установил text?

Я нашел подобные вопросы, но ни один, кажется, не предоставляет краткий ответ, и мне кажется, что должно быть действительно легко получить его без любых издержек при переставлении с boundingRectWithSize или sizeWithFont,...

59
задан 23 January 2015 в 14:30

3 ответа

Кажется, что официальный веб-сайт разработчика упоминает Строки подсчета решения текста в Objc. Однако это предполагает, что у Вас есть ссылка на текстовое представление, настроенное с менеджером по расположению, текстовым устройством хранения данных и текстовым контейнером. К сожалению, UILabel не подвергает тех, которые нам, таким образом, мы должны создать их с той же конфигурацией как UILabel.

я перевел код Objc в быстро как после. Это кажется работой хорошо для меня.

extension UILabel {
    var actualNumberOfLines: Int {
        let textStorage = NSTextStorage(attributedString: self.attributedText!)
        let layoutManager = NSLayoutManager()
        textStorage.addLayoutManager(layoutManager)
        let textContainer = NSTextContainer(size: self.bounds.size)
        textContainer.lineFragmentPadding = 0
        textContainer.lineBreakMode = self.lineBreakMode
        layoutManager.addTextContainer(textContainer)

        let numberOfGlyphs = layoutManager.numberOfGlyphs
        var numberOfLines = 0, index = 0, lineRange = NSMakeRange(0, 1)

        while index < numberOfGlyphs {
            layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange)
            index = NSMaxRange(lineRange)
            numberOfLines += 1
        }
        return numberOfLines
    }
}
2
ответ дан 1 November 2019 в 11:10
let l = UILabel()
l.numberOfLines = 0
l.layer.frame.size.width = self.view.frame.width - 40 /*padding(20 + 20)*/

l.font = UIFont(name: "BwModelica-Bold", size: 16.0)

l.text = "Random Any length Text!!"

let noOfLines = ceil(l.intrinsicContentSize.width) / l.frame.width)

let lbl_height = noOfLines * l.intrinsicContentSize.height

Это будет Вашей Точной динамической высотой Маркировки и Количеством строк. Счастливое кодирование!!!

0
ответ дан 1 November 2019 в 11:10

Обратите внимание, что @kurt-j's ответ будет не всегда работать. В некоторых случаях необходимо будет вручную обеспечить ширину маркировки. Так как эти случаи существуют, это - хорошая идея иметь дополнительный параметр ширины, даже если Вы не заканчиваете тем, что использовали его.

Swift 4.2:

extension UILabel {
    func calculateMaxLines(actualWidth: CGFloat?) -> Int {
        var width = frame.size.width
        if let actualWidth = actualWidth {
            width = actualWidth
        }
        let maxSize = CGSize(width: width, height: CGFloat(Float.infinity))
        let charSize = font.lineHeight
        let text = (self.text ?? "") as NSString
        let textSize = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
        let linesRoundedUp = Int(ceil(textSize.height/charSize)) 
        return linesRoundedUp
    }    
}
0
ответ дан 1 November 2019 в 11:10

Другие вопросы по тегам:

Похожие вопросы: