Замените
redBox.heightAnchor.constraint(equalTo: self.heightAnchor, constant: 0.5)
на
redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5).isActive = true
NSLayoutConstraint.activate([
redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor),
redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor),
redBox.widthAnchor.constraint(equalToConstant: 100),
redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5)
])
Сначала в вашем текущем коде вы пропускаете .isActive = true
, который имеет такой же эффект, как если бы строка нене существует, и если указано, это сделает высоту окна равной высоте вида + константе (= 0,5)
высота ящика = высота вида * множитель + константа
а так как множитель по умолчанию = 1 и вы установите константу = 0,5, это будет
высота поля = высота просмотра * 1,0 + 0,5
Но вместо этого вам нужно
высота поля = высота просмотра * 0,5 + 0 // опустить параметр consatnt в ограничении, и он будет равен нулю
class BoxView: UIView {
public var redBox: UIImageView
public override init(frame: CGRect) {
super.init(frame: frame)
redBox = UIImageView(frame: .zero)
redBox.backgroundColor = .red
self.backgroundColor = .yellow
addSubview(redBox)
redBox.translatesAutoresizingMaskIntoConstraints = false
let margins = layoutMarginsGuide
NSLayoutConstraint.activate([
redBox.centerXAnchor.constraint(equalTo: self.centerXAnchor),
redBox.centerYAnchor.constraint(equalTo: self.centerYAnchor),
redBox.widthAnchor.constraint(equalToConstant: 100),
redBox.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5)
])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}