Заполнение текста на UILabel

Здесь я пытаюсь создать метку с отступами (слева, справа, сверху и снизу) вокруг текста. Эта проблема связана с сообщением о SOF, и, прочитав несколько из них, я попытался использовать решение, предложенное здесь :

Это код для моего подкласса UILabel:

import UIKit

class LuxLabel: UILabel {
    //let padding: UIEdgeInsets
    var padding: UIEdgeInsets = UIEdgeInsets.zero {
        didSet {
            self.invalidateIntrinsicContentSize()
        }
    }    

    // Create a new PaddingLabel instance programamtically with the desired insets
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) {
        self.padding = padding
        super.init(frame: CGRect.zero)
    }

    // Create a new PaddingLabel instance programamtically with default insets
    override init(frame: CGRect) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(frame: frame)
    }

    // Create a new PaddingLabel instance from Storyboard with default insets
    required init?(coder aDecoder: NSCoder) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(coder: aDecoder)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, padding))
    }

    // Override `intrinsicContentSize` property for Auto layout code
    override var intrinsicContentSize: CGSize {
        let superContentSize = super.intrinsicContentSize
        let width = superContentSize.width + padding.left + padding.right
        let heigth = superContentSize.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }
}

Он основан на PaddingLabel (см. ссылку выше).

В основном это работает хорошо, но по некоторым причинам, которые я не понимаю, бывают случаи, когда что-то идет не так, и дисплей обрезается.

Вот пример:

Строка для размещения на этикетке:

«Он имеет квадратную форму и синий цвет».

Код для создания ярлыка:

let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10))
label.numberOfLines = 0

и это результат:

введите здесь описание изображения

Если я добавлю эту строку к двум выше:

label.lineBreakMode = .byWordWrapping

результат:

введите здесь описание изображения

Я также установил некоторые ограничения. Все это работает в 95% случаев. Кто-нибудь может увидеть, в чем проблема?


person Michel    schedule 11.11.2017    source источник
comment
Вы установили numberOfLines = 0 и lineBreakMode = .byWordWrapping ?   -  person Priya    schedule 11.11.2017
comment
Я установил numberOfLines = 0, но не lineBreakMode = .byWordWrapping. На самом деле у меня есть несколько случаев, когда несколько строк отлично работают. И это не решит проблему, если я установлю lineBreakMode = .byWordWrapping, я отредактировал свой пост, чтобы добавить подробности об этом, пожалуйста, посмотрите.   -  person Michel    schedule 11.11.2017
comment
Вы установили ограничение статической высоты для метки?   -  person Priya    schedule 11.11.2017
comment
Нет, для метки нет статического ограничения высоты. Я полагаю, именно поэтому это работает большую часть времени.   -  person Michel    schedule 12.11.2017
comment
Я все время использую дополненные метки, просто переопределяя drawTextInRect, и у меня никогда не было проблем. Я не понимаю, для чего нужна реализация intrinsicContentSize. Что будет, если просто удалить?   -  person matt    schedule 12.11.2017


Ответы (1)


Попробуйте вызвать invalidateIntrinsicContentSize:

var padding: UIEdgeInsets = UIEdgeInsets.zero {
    didSet {
        self.invalidateIntrinsicContentSize()
    }
}

ИЗМЕНИТЬ:

Я пробовал разные варианты. Если вы обновите frame size с помощью intrinsicContentSize в layoutSubviews, это поможет, но я не знаю, есть ли лучший способ сделать это:

override func layoutSubviews() {
    super.layoutSubviews()
    self.frame.size = self.intrinsicContentSize
}
person Francesco Deliro    schedule 11.11.2017
comment
Я попробовал это, заменив let padding на var padding, как вы предлагаете, но, к сожалению, это не имеет никакого значения. - person Michel; 12.11.2017
comment
@Michel Завтра я попытаюсь воспроизвести это, и если я что-то найду, я дам вам знать. - person Francesco Deliro; 12.11.2017
comment
Я создал проект на GitHub(github.com/zaxonus/TextPad), чтобы показать проблему. - person Michel; 15.11.2017
comment
Я проверю ;) - person Francesco Deliro; 15.11.2017
comment
Да, ты прав. Это делает это. Я тоже не знаю, есть ли лучший способ. Спасибо за ваше предложение. - person Michel; 20.11.2017