UILabel текст обрезается с неправильным выравниванием при добавлении imageView - PullRequest
1 голос
/ 18 апреля 2019

У меня есть подкласс UILabel, который я собираюсь использовать для примерно 10 различных меток различной длины (все по одной строке!) В IB. Текст в каждой из этих меток является статическим.

В этой подклассе UILabel должно отображаться изображение слева от текста. Этот imageView будет содержать маленький значок.

Это близко к работе, за исключением того, что я получаю странное усечение и выравнивание, как показано на скриншоте ниже.

Simulator:

Text truncating

Настройка раскадровки:

Storyboard Setup

Вот мой код:

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)
    }

    override func drawText(in rect: CGRect) {
        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 10.0, bottom: 0, right: labelHeight + 10.0)
        }
        else {
            insets = UIEdgeInsets(top: 0, left: labelHeight + 5.0, bottom: 0, right: labelHeight + 5.0)
        }
        super.drawText(in: rect.inset(by: insets))
    }

}

Относительно автоматической разметки - все метки находятся в вертикальном виде стека.

Как сделать так, чтобы текст и изображение просматривались по центру без обрезания текста?

1 Ответ

0 голосов
/ 18 апреля 2019

Смена кадра в UIStuff метод,

class ImageMarkLabel: UILabel {

    var labelHeight:CGFloat = 0.0
    let smileView = UIView()
    let smileImageView = UIImageView()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()

    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        uiStuff()
    }

    func uiStuff() {
        labelHeight = self.frame.height
        smileView.frame = CGRect(x: 0, y: 0, width: labelHeight, height: labelHeight)
        smileImageView.image = UIImage(named: "smile")
        smileImageView.frame = CGRect(x: 0, y: 0, width: smileView.frame.width, height: smileView.frame.height)

        var insets = UIEdgeInsets()
        if UIDevice.current.userInterfaceIdiom == .pad {
            insets = UIEdgeInsets(top: 0, left: (labelHeight + 10.0), bottom: 0, right: (labelHeight + 10.0))
        }
        else {
            insets = UIEdgeInsets(top: 0, left: (labelHeight + 5.0), bottom: 0, right: (labelHeight + 5.0))
        }
        let newRect = CGRect(origin: self.frame.origin, size: CGSize(width: self.frame.width + 2*insets.left, height: self.frame.height))
        self.frame = newRect
    }

    func commonInit(){
        smileView.addSubview(smileImageView)
        self.addSubview(smileView)

    }

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

}

Выход:

enter image description here

...