У меня есть приложение, в котором я хотел бы поддерживать поворот устройства в определенных представлениях, но другие не имеют особого смысла в ландшафтном режиме, поэтому, когда я меняю местами представления, я хотел бы принудительно установить поворот в портретном режиме.
На UIDevice есть недокументированный установщик свойств, который делает трюк, но, очевидно, генерирует предупреждение компилятора и может исчезнуть с будущей версией SDK.
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
Есть ли какие-нибудь задокументированные способы заставить ориентироваться?
Обновление: я подумал, что приведу пример, поскольку я не ищу shouldAutorotateToInterfaceOrientation, поскольку я уже реализовал это.
Я хочу, чтобы мое приложение поддерживало альбомную и портретную ориентацию в представлении 1, но только портретное положение в представлении 2. Я уже реализовал shouldAutorotateToInterfaceOrientation для всех представлений, но если пользователь находится в альбомном режиме в представлении 1, а затем переключается на представление 2, я хочу принудительно телефон, чтобы вернуться в портретную ориентацию.
источник
Ответы:
Это больше не проблема в более позднем iPhone 3.1.2 SDK. Теперь он, кажется, соблюдает запрошенную ориентацию представления, возвращаемого в стек. Скорее всего, это означает, что вам нужно будет обнаруживать более старые версии iPhone OS и применять setOrientation только тогда, когда он предшествует последней версии.
Неясно, поймет ли статический анализ Apple, что вы работаете в обход старых ограничений SDK. Мне лично Apple посоветовал удалить вызов метода в моем следующем обновлении, поэтому я еще не уверен, пройдет ли процесс утверждения взлома для старых устройств.
источник
Это уже давно постфактум, но на всякий случай придет кто-нибудь, кто не использует контроллер навигации и / или не желает использовать недокументированные методы:
Достаточно представить и закрыть ванильный контроллер представления.
Очевидно, вам все равно потребуется подтвердить или отклонить ориентацию при переопределении shouldAutorotateToInterfaceOrientation. Но это приведет к тому, что система снова вызовет shouldAutorotate ...
источник
Если вы хотите заставить его повернуться из книжной в альбомную, вот код. Просто обратите внимание, что вам нужно отрегулировать центр вашего обзора. Я заметил, что мой вид не в нужном месте. В остальном все работало отлично. Спасибо за чаевые.
источник
CGAffineTransformMakeRotation
повернуть представление, но UIAlertView по-прежнему соответствует ориентации строки состояния, т.е. -degreeToRadian (angle)? У вас получилось что-то подобное?UIAlertView
- установить контроллер представления в качестве делегата alertView, а затем на:- (void) didPresentAlertView:(UIAlertView *) alertView
вы выполните вращение на основе текущего[UIApplication sharedApplication].statusBarOrientation
. Если не анимировать, не должно выглядеть слишком странно.Насколько я могу судить,
setOrientation:
метод не работает (или, возможно, больше не работает). Вот что я делаю для этого:сначала поместите это определение в начало файла, прямо под #imports:
то в
viewWillAppear:
методеесли вы хотите, чтобы это было анимировано, вы можете обернуть все это в блок анимации, например:
Затем в контроллере портретного режима вы можете сделать обратное - проверить, находится ли он в настоящее время в альбомной ориентации, и если да, повернуть обратно в портретную ориентацию.
источник
У меня возникла проблема, когда
UIViewController
на экране былUINavigationController
значок в альбомной ориентации. Однако, когда следующий контроллер представления помещается в поток, мне нужно, чтобы устройство вернулось в портретную ориентацию.Я заметил, что
shouldAutorotateToInterfaceOrientation:
метод не вызывается, когда новый контроллер представления помещается в стек, а вызывается, когда контроллер представления выталкивается из стека .Воспользовавшись этим, я использую этот фрагмент кода в одном из своих приложений:
По сути, создав пустой контроллер представления, поместив его в стек и немедленно отключив, можно заставить интерфейс вернуться в портретное положение. После того, как контроллер был выдвинут, я просто нажимаю на тот контроллер, который я намеревался нажать в первую очередь. Визуально это выглядит великолепно - пустой произвольный контроллер представления никогда не просматривается пользователем.
источник
Существует простой способ программно принудительно настроить iPhone в нужной ориентации - используя два из уже предоставленных ответов kdbdallas , Джош :
работает как шарм :)
РЕДАКТИРОВАТЬ:
для iOS 6 мне нужно добавить эту функцию: (работает на модальном контроллере просмотра)
источник
Я копал и копал в поисках хорошего решения этой проблемы. Нашел это сообщение в блоге, в котором есть трюк: удалите самое внешнее представление из ключа
UIWindow
и добавьте его снова, затем система повторно запроситshouldAutorotateToInterfaceOrientation:
методы из ваших контроллеров представления, применяя правильную ориентацию. Смотрите: iphone заставляет uiview переориентироватьисточник
Ответ Джоша отлично подходит для меня.
Однако я предпочитаю публиковать уведомление «ориентация изменилась, обновите интерфейс» . Когда это уведомление получено контроллером представления, он вызывает
shouldAutorotateToInterfaceOrientation:
, позволяя вам установить любую ориентацию, вернувшисьYES
к желаемой ориентации.Единственная проблема в том, что это приводит к переориентации без анимации. Вам нужно будет обернуть эту линию между
beginAnimations:
и,commitAnimations
чтобы добиться плавного перехода.Надеюсь, это поможет.
источник
FWIW, вот моя реализация ручной настройки ориентации (для перехода в корневой контроллер представления вашего приложения, natch):
в сочетании со следующим
UINavigationControllerDelegate
методом (при условии, что вы используетеUINavigationController
):Это позаботится о повороте корневого представления в зависимости от того,
UIViewController
поддерживает ли входящий текущую ориентацию устройства. Наконец, вы захотите подключитьсяrotateInterfaceToOrientation
к фактическим изменениям ориентации устройства, чтобы имитировать стандартные функции iOS. Добавьте этот обработчик событий в тот же контроллер корневого представления:Наконец, зарегистрируйтесь для получения
UIDeviceOrientationDidChangeNotification
уведомленийinit
илиloadview
примерно так:источник
shouldAutorotate
метода (см. Stackoverflow.com/a/12586002/5171 ).У меня это работает (спасибо, Генри Кук):
Для меня целью было иметь дело только с изменением ориентации ландшафта.
метод инициализации:
источник
Я понимаю, что вышеприведенное исходное сообщение в этой ветке сейчас очень старое, но у меня была аналогичная проблема - т.е. все экраны в моем приложении только портретные, за исключением одного экрана, который пользователь может поворачивать между альбомным и портретным.
Это было достаточно просто, но, как и другие сообщения, я хотел, чтобы приложение автоматически возвращалось в портретную ориентацию независимо от текущей ориентации устройства при возврате к предыдущему экрану.
Решение, которое я реализовал, заключалось в том, чтобы скрыть панель навигации в альбомном режиме, что означает, что пользователь может вернуться к предыдущим экранам только в портретном режиме. Следовательно, все остальные экраны могут быть только портретными.
Это также имеет дополнительное преимущество для моего приложения в том, что в ландшафтном режиме доступно больше места на экране. Это полезно, потому что рассматриваемый экран используется для отображения файлов PDF.
Надеюсь это поможет.
источник
В конце концов, я решил это довольно легко. Я пробовал все предложения, приведенные выше, и все равно не смог, так что это было моим решением:
В ViewController, который должен оставаться в альбомной ориентации (влево или вправо), я прислушиваюсь к изменениям ориентации:
Затем в didRotate:
Имейте в виду любые Super Views / Subviews, которые используют автоматическое изменение размера, поскольку view.bounds / frame явно сбрасываются ...
Единственное предостережение к этому методу сохранения ландшафта вида - это внутреннее переключение анимации между ориентациями, которое должно происходить, когда было бы лучше, чтобы оно не менялось.
источник
Решение iOS 6:
Точный код зависит от приложения, а также от того, где вы его разместили (я использовал его в своем AppDelegate). Замени
[[self window] rootViewController]
на то, что используешь. Я использовалUITabBarController
.источник
Я нашел решение и написал что-то на французском (но код на английском). Вот
Способ состоит в том, чтобы добавить контроллер в представление окна (контроллер должен иметь хорошую реализацию функции shouldRotate ....).
источник
Если вы используете UIViewControllers, есть этот метод:
Возвращение
NO
для контроллеров представлений, содержащих представления, которые вы не хотите вращать.Больше информации здесь
источник
Я не думаю, что это возможно сделать во время выполнения, хотя вы, конечно, можете просто применить 90-градусное преобразование к своему пользовательскому интерфейсу.
источник
Это то, что я использую. (Вы получаете некоторые предупреждения о компиляции, но это работает как в симуляторе, так и в iPhone)
источник