Используйте updateViewConstraints() для имитации собственного поведения интерфейса камеры iOS при изменении ориентации
Это третий метод, который я пытался использовать для создания интерфейса, который плавно имитирует поведение, которое вы видите в родном интерфейсе камеры iOS. Если вы переориентируете устройство в интерфейсе камеры iOS, вы заметите, что интерфейс в основном остается стационарным, но объекты, имеющие ориентацию "вверх", вращаются на месте к правильной ориентации.
Вещи, которые не сработали:
Использование преобразований на отдельных элементах, которые нужно вращать. Это работает, но элементы не вращаются с плавными анимациями, которые вы видите в родном приложении iOS, и это приводит к некоторым раздражающим проблемам. В частности, часть моего интерфейса позволяет пользователям обмениваться информацией, не выходя из этого интерфейса, но когда отображается представление общего доступа, оно исходит из неправильного места, затем поворачивается и оказывается вне центра. Подробнее о том, как это сделать, см. Мой вопрос на эту тему, а также мой ответ здесь.
Использование viewWillTransitionToSize для противодействия вращению интерфейса (с анимацией). Чтобы сделать это, у вас есть невращающийся вид, вращающий противоположное направление изменения ориентации, затем значки, которые необходимо повернуть на месте, вращающиеся в противоположном направлении не вращающийся вид. Все становится анимированным, чтобы синхронизироваться с анимацией по умолчанию для superview по мере переориентации. Это заняло у меня целую вечность, но я, наконец, решил это. Вот отдельная тема на эту тему. Я все еще чувствую, что это своего рода грязный способ сделать это, хотя и хотел бы увидеть, есть ли лучший способ сделать это.
Использование updateViewConstraints() для достижения этого поведения
Я убежден, что это сработает и, возможно, это самое чистое решение. Но я не могу заставить его работать. Вот основная идея в доказательстве концепции, с которой я вначале возиться... Когда приложение загружается впервые, начните с ограничения, которое связывает подпредставление с верхним краем его родителя, а другое - для его центрирования по оси x, Если пользователь поворачивает устройство влево (альбомная ориентация вправо), тогда подпредставление получает новое ограничение, связывающее его с тем, что сейчас является левым краем родителя, и центрируется вдоль того, что сейчас является осью y.
У меня есть раскадровка, которая делает первоначальный макет. Насколько я могу судить, ничего из того, что я установил в updateViewConstraints, в конечном итоге ничего не делает. Ниже приведен основной раздел кода, с которым я работаю, или вы можете скачать проект Xcode, который я использую в качестве POC, здесь.
override func updateViewConstraints() {
//northView.removeConstraints(northView.constraints)
//northView.bounds.size = CGSizeMake(25, 25)
//northView.frame.size = CGSizeMake(25, 25)
switch UIDevice.currentDevice().orientation {
case .LandscapeLeft:
northView.rightAnchor.constraintEqualToAnchor(blueBackground.rightAnchor, constant: 20)
northView.centerYAnchor.constraintEqualToAnchor(blueBackground.centerYAnchor)
case .LandscapeRight:
northView.leftAnchor.constraintEqualToAnchor(blueBackground.leftAnchor, constant: 20)
northView.centerYAnchor.constraintEqualToAnchor(blueBackground.centerYAnchor)
case .PortraitUpsideDown:
northView.bottomAnchor.constraintEqualToAnchor(blueBackground.bottomAnchor, constant: 20)
northView.centerXAnchor.constraintEqualToAnchor(blueBackground.centerXAnchor)
default:
northView.topAnchor.constraintEqualToAnchor(blueBackground.topAnchor, constant: 20)
northView.centerXAnchor.constraintEqualToAnchor(blueBackground.centerXAnchor)
}
super.updateViewConstraints()
}
Кто-нибудь знает, как заставить это работать, используя этот метод?