Пара примечаний ...
1) В общем случае представление не должно устанавливать свой собственный кадр.Что произойдет, если вы хотите добавить MyView
в качестве подпредставления другого представления?Установка его фрейма, как у вас:
width: UIScreen.main.bounds.width - 16.0
не даст вам желаемых результатов.
2) Вам нужно не нужно:
self.addConstraints(constraints)
3) Я считаю полезным давать элементам разные, очевидные цвета фона - позволяет легко увидеть, что делают фреймы.
Вот отредактированная версия вашей сущности вместе с контроллером представления длядобавить / отобразить его:
import UIKit
class MyView: UIView {
var label: UILabel!
var text: String? {
didSet {
label.text = text
}
}
var cornerRadius: CGFloat = 0.0 {
didSet {
self.layer.cornerRadius = self.cornerRadius
self.layer.masksToBounds = true
}
}
var textColor: UIColor = UIColor.black {
didSet {
label.textColor = textColor
}
}
var isTextCentered: Bool = false {
didSet {
self.label.textAlignment = isTextCentered ? .center : .left
}
}
init() {
// we'll be using constraints, so no need to set a frame
super.init(frame: CGRect.zero)
initialize()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
fileprivate func initialize() {
label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.numberOfLines = 0
self.addSubview(label)
let constraints = [
NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 8.0),
NSLayoutConstraint(item: label, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 8.0),
NSLayoutConstraint(item: label, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: -8.0),
NSLayoutConstraint(item: label, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: -8.0)
]
NSLayoutConstraint.activate(constraints)
// so we can see self's frame
self.backgroundColor = .red
// so we can see label's frame
label.backgroundColor = .yellow
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// instantiate the custom view
let v = MyView()
// we'll be using constraints
v.translatesAutoresizingMaskIntoConstraints = false
// add the view
view.addSubview(v)
NSLayoutConstraint.activate([
// constrain Top: 60 / Leading: 8 / Trailing: -8
v.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 60.0),
v.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 8.0),
v.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -8.0),
// constrain height >= 60
v.heightAnchor.constraint(greaterThanOrEqualToConstant: 60.0),
])
// add 10 lines of text
v.text = (1...10).map({ "Line \($0)" }).joined(separator: "\n")
}
}
И результат: