То, как вы загружаете XIB, создает два UIView
объектов, где вы можете подумать, что он создает только один.
Вы можете легко увидеть этоиспользование Debug View Hierarchy
Здесь синий вид - это вид, добавленный в раскадровку, с нормально установленными ограничениями (в данном случае 40 пунктов с каждой стороны, высота 100 и по центру по вертикали).
Красный вид - это вид, с которым вы работаете при разработке XIB, и он имеет метку с черным фоном, ограниченную 0
со всех четырех сторон.
Ваш XIB класс равен UIView
- так что это его собственный вид ... Когда вы добавили UIView
к вашей раскадровке и установили егокласс до CustomLabel
, который становится «корневым» представлением.В своем коде вы добавляете view
в качестве подпредставления ... которое должно дать вам подсказку, что у вас есть два UIView
объекта.
Теперь произошло то, что CustomLabel
(то есть UIView
) использует ограничения, которые вы установили в раскадровке, но в подпредставлении view
не установлены ограничения.
Если вы измените свой код загрузки на этот (я изменил ваши IBOutlet
имена, потому что добавление «представления» в качестве подпредставления к другому «представлению» может привести к путанице):
class CustomLabel: UIView {
@IBOutlet var theView: UIView!
@IBOutlet weak var thelabel: UILabel!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("CustomLabel")
Bundle.main.loadNibNamed("CustomLabel", owner: self, options: nil)
self.addSubview(self.theView)
self.theView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
self.theView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0.0),
self.theView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0.0),
self.theView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0.0),
self.theView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0.0),
])
}
}
Теперь ваш код загружаетсяпредставление из XIB добавляет его в качестве подпредставления CustomLabel
(которое, опять же, само по себе UIView
) и устанавливает ограничения, как и следовало ожидать, давая такой результат:
Как вы можете видеть, theView
, который был добавлен как подпредставление (красный на этом изображении), теперь ограничен своим суперпредставлением - синий CustomLabel
.