Обратите внимание, что метод constraint
создает new для вашего изображения.
При первом вызове setupLayout
в viewDidLoad
добавляются ограничения ширины и высоты 200просмотр изображения.Затем вы поворачиваете устройство, чтобы перейти в ландшафт.setupLayout
вызывается снова.На этот раз он добавляет ограничения ширины и высоты 100, , но не деактивирует ограничения с константой 200, которые вы ранее добавили .Выполнение этой строки:
imageView.widthAnchor.constraint(equalToConstant: 200).isActive = false
Создает новое неактивное ограничение, not деактивирует старое.
Что вам нужно сделать, это сохранить ограничения ширины и высоты каксвойства ViewController
:
var widthConstraint: NSLayoutConstraint!
var heightConstraint: NSLayoutConstraint!
И в setupLayout
присвойте эти свойства:
private func setupLayout(imageView: UIImageView){
widthConstraint = imageView.widthAnchor.constraint(equalToConstant: 200)
heightConstraint = imageView.heightAnchor.constraint(equalToConstant: 200)
widthConstraint.isActive = true
heightConstraint.isActive = true
imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
}
И вам следует вызывать setupLayout
только один раз.
Затем вы создаете другой метод с именем updateConstraints
, который обновляет константы widthConstraint
и heightConstraint
:
private func updateConstraints() {
if UIDevice.current.orientation.isLandscape {
heightConstraint.constant = 100
widthConstraint.constant = 100
} else {
heightConstraint.constant = 200
widthConstraint.constant = 200
}
}
Вызывайте это в viewWillTransitionToSize
вместо setupLayout
.