Почему мой объект UILabel не отображается в своем суперпредставлении? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть этот подкласс UIView, который создал объект UILabel и добавил его как подпредставление. Код ниже. Я помещаю объект UIView в представление контроллера представления, и я устанавливаю подкласс в свой подкласс UTIDropDownView. Когда я запускаю приложение на устройстве, я вижу линию, которую я рисую, но не вижу объекта UILabel.

Может кто-нибудь сказать мне, что я делаю не так?

import UIKit

class UTIDropDownView: UIView {

    var label = UILabel()

    override init(frame: CGRect) {
        super.init(frame: frame)

        let labelFrame = CGRect(width: frame.width - frame.height, height: frame.height)

        label = UILabel(frame: labelFrame)

        addSubview(label)

        label.text = "UTIDropDownView"

        label.isHidden = false
        label.isUserInteractionEnabled = true
        label.backgroundColor = UIColor.red

        label.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint(item: label, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1, constant: 0).isActive = true
        NSLayoutConstraint(item: label, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1, constant: frame.height).isActive = true
        NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 0).isActive = true
        NSLayoutConstraint(item: label, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 0).isActive = true

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {

        let labelWidth: CGFloat = frame.width - frame.height
        let triangleBorder: CGFloat = frame.height * 0.1

        let path = UIBezierPath()

        UIColor.darkGray.setStroke()

        path.move(to: CGPoint(x: labelWidth + triangleBorder, y: triangleBorder))
        path.addLine(to: CGPoint(x: frame.width - triangleBorder, y: triangleBorder))
        path.stroke()

    }

}

Когда я добавляю следующий код в Draw (_:)

print(rect)

Я получаю следующие результаты печати:

(0,0, 0,0, 120,0, 30,0)

1 Ответ

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

Вы переопределяете draw(_ rect:), но фактически не рисуете метку в этой функции. Вы можете вызвать super.draw(rect) в вашем методе рисования, чтобы представление сначала отображало его содержимое, а затем вы рисовали свои собственные вещи после этого.

class UTIDropDownView: UIView {

let label = UILabel()

override init(frame: CGRect) {
    super.init(frame: frame)
    setupLabel()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupLabel()
}

private func setupLabel() {
    let labelFrame = CGRect(width: frame.width - frame.height, height: frame.height)

    label.frame = labelFrame

    addSubview(label)

    label.text = "UTIDropDownView"

    label.isHidden = false
    label.isUserInteractionEnabled = true
    label.backgroundColor = UIColor.red

    label.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint(item: label, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: label, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1, constant: frame.height).isActive = true
    NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint(item: label, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 0).isActive = true

}

override func draw(_ rect: CGRect) {
    super.draw(rect)

    ...
}

}

...