Представления не отвечают на shouldAutorotateToInterfaceOrientation, контроллеры представления делают.Если ваш контроллер представления говорит, что он будет вращаться, то его представление и все дочерние представления будут вращаться.Если ваш контроллер представления говорит, что он не будет вращаться, то его представление не будет вращаться, как и его дочерние элементы.
Существует два возможных подхода к решению вашей проблемы, в зависимости от того, что именно вы хотите сделать:
- если не вращающийся вид находится за всем, что вращается, вы можете удалить его из контроллера представления и добавить его в главное окно приложения за контроллером представления при viewWillAppear: и снова удалить его при viewDidDisappear:
- если не вращающиеся и вращающиеся представления необходимо смешать более сложным способом, вы можете перехватить willAnimateRotationToInterfaceOrientation: duration: и установить подходящее обратное преобразование для невращающегося представления.Так что его повернули, а затем развернули.Вам нужно быть немного хитрым, чтобы получить правильное поведение между определенными поворотами на 180 градусов из-за того, как работает CoreAnimation.
UIApplication
предоставляет средство для получения окна ключа в виде объекта UIWindow,что, вероятно, то, что вы хотели бы для первой идеи.UIWindow наследует от UIView, поэтому применяются все стандартные механизмы добавления и упорядочения подпредставлений.
Для последнего вы захотите установить преобразование в соответствующем представлении.Получить преобразование из суперпредставления, получить обратное и установить его на виде.См. CGAffineTransform для получения дополнительной информации.Проблема CoreAnimation, о которой упоминалось, заключается в том, что переход от одного поворота к 180 °, отличающемуся по кратчайшему маршруту (как примет CoreAnimation), дает два возможных решения - одно по часовой стрелке и одно против часовой стрелки.На практике вам нужно добавить невидимое смещение к преобразованию вида в портретном режиме, чтобы CoreAnimation выбрал правильный, если вы поворачиваете между портретом и портретом вверх ногами.Если вы используете iPhone, вполне допустимо не поддерживать UIInterfaceOrientationPortraitUpsideDown
на этом устройстве (большинство приложений Apple этого не делают), поэтому на самом деле, вероятно, проще просто не поддерживать эту ориентацию.