Обновление ограничений на изменение ориентации

Ниже представлен вид в портретном режиме (изображение 1) и в альбомной ориентации, который я хотел показать как (изображение 2). Я сталкиваюсь с проблемой, чтобы показать в нем должным образом в ландшафте.

Изображение 1:

У меня есть ограничения настройки в раскадровке.

greenView: top: 0, leading: 0, trailing: 0, width: equal to superview.width, height: equal to superview.height/2

Изображение 2: Я попытался изменить ограничения, но когда я поворачиваю устройство в альбомную ориентацию, greenView становится 1/4 экрана. ниже код.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        greenView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
        greenView.heightAnchor.constraint(equalToConstant: 0).isActive = true
    } else {
    }
}

2 ответа

Вместо головной боли создания ограничений для этой проблемы вставьте оба представления в UIStackView (вертикальный) и внутри viewWillTransition изменить ось на горизонтальную, если ориентация isLandscape

плюс добавление этих ограничений

greenView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
greenView.heightAnchor.constraint(equalToConstant: 0).isActive = true

создаст конфликт, так как старые не будут удалены

//

func shared () {

     if UIDevice.current.orientation == .portrait {

         self.stView.axis = .vertical
     }
     else {

         self.stView.axis = .horizontal 
     }

 }

Вызовите вышеуказанный метод в viewDidLoad & viewWillTransition

isActive Флаг является крайне неправильно понятым вариантом. Этот флаг не изменяет состояние ограничения, он полностью добавляет или удаляет ограничение.

greenView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.50).isActive = true
greenView.heightAnchor.constraint(equalToConstant: 0).isActive = true

Приведенный выше код добавит несколько ограничений на ваш взгляд. Каждый раз, когда вы поворачиваете свое устройство, к вашему виду добавляется новое ограничение ширины, что приводит к тому, что ваш вид имеет несколько ограничений по высоте и ширине. Чтобы добавить / удалить то же ограничение, сохраните его ссылку, затем используйте isActive в теме.

Я не уверен, почему вы устанавливаете ограничение высоты на 0?

Теперь перейдем к тому, что вы хотите сделать. Я могу думать о 2 подходах

1-й подход

Добавьте еще два ограничения в дополнение к существующим ограничениям в вашей раскадровке, но оставьте их приоритет низким (<1000):

1. greenView.bottom = safeArea.bottom
2. greenView.width = superView.width/2

Сделать IBOutlet из greenView.height = superview.height/2 and greenView.trailing = superView.trailing, Розетки должны иметь те ограничения, которые имеют высокий приоритет. Убедитесь, что ваши розетки не слабы, иначе их розетка станет нулевой, когда вы установитеisActive false, Теперь все, что вам нужно сделать, это установить, когда устройство переходит в ландшафтный режим:

highPriorityGreenViewConstraint.isActive = false
highPriorityHeightConstraint.isActive = false

2-й подход

Используйте классы размера, чтобы установить ограничение. Все классы размера упомянуты здесь.

Пример - установка greenView.bottom = safeArea.bottom,greenView.width = superView.width/2 ограничения для compact width compact height только размер класса. Вы должны будете наложить больше ограничений в этом подходе, поскольку класс альбомного размера отличается даже среди моделей iPhone.

Другие вопросы по тегам