Ваш вопрос может касаться более подробной информации, чтобы быть уверенным в том, чего вы пытаетесь достичь. Вот ответ, но, учитывая этот вопрос, немного расплывчатый, я мог бы сделать некоторые неправильные предположения.
Метод, на который вы ссылаетесь, -shouldAutoRotate
, применяется только к представлению верхнего уровня viewController. Поля зрения не вращаются, относительно говоря. Но они могут корректироваться в соответствии с новой компоновкой.
Что вы, вероятно, хотите сделать, это контрротировать «статический» вид, чтобы он сохранял фиксированный аспект относительно экрана.
Док вы цитируете из имеет в виду этих методов (предварительное ios8)
– willRotateToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
в ios8 они устарели и заменены
- viewWillTransitionToSize:withTransitionCoordinator:
Если вы используете этот метод, вы будете необходимо проверить ориентацию от [UIDevice currentDevice]
и выполнить регулировку против вращений (которая будет преобразованием вращения).
Если это не сработает для вас, всегда можно создать собственное представление и иметь его (или viewController) для уведомлений о ротации устройства. Для этого нужно отправить beginGeneratingDeviceOrientationNotifications
в [UIDevice currentDevice]
и затем зарегистрировать для этих уведомлений с центром уведомлений: «что о кадре»
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(deviceOrientationDidChange)
name:UIDeviceOrientationDidChangeNotification object:nil];
редактировать
Что о кадра? Здесь это не актуально.Вы примените преобразование вращения к своему «невращающему» виду. Apple советует никогда не получать или не устанавливать свойство кадра после применения преобразований, поскольку числа больше не имеют смысла. Вы можете установить границы и свойства центра, или, возможно, лучше использовать ограничения автоопределения или авторезистирующую маску, чтобы получить результат.
edit2
Вот (анимации) Пример использования viewWillTransitionToSize
:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
UIDeviceOrientation deviceOrientation =
[UIDevice currentDevice].orientation;
CGAffineTransform transform =
[self transformForOrientation:deviceOrientation];
CGPoint center =
[self centerForOrientation:deviceOrientation];
[UIView animateWithDuration:0.2 animations:^{
self.rotatingView.center = center;
self.rotatingView.transform = transform;
}];
}
, где transformForOrientation
будет возвращать соответствующее преобразование поворота, и centerForOrientation
будет возвращать центр, производный от центра оригинального неповёрнутых зрения в координаты.
Использование viewWillTransition
позволяет вам управлять поворотом до, интерфейс повернулся к новой ориентации устройства. На этом этапе UIDeviceOrientation
даст вам правильную ориентацию адресата, в то время как UIInterfaceOrientation
все равно вернет предварительно повернутый аспект. Если вам нужна очень плохая координация между анимациями, вы можете использовать объект UIViewControllerTransitionCoordinator.
Что относительно рамки? – orkenstein
@orkenstein - см. Мое обновление – foundry
Ограничения имеют смысл для меня, я могу динамически изменять постоянную высоту/ширину. Но авторезистирующую маску? Я всегда думал, что аффинное преобразование применяется после макета. – orkenstein