Приложение для iPhone в ландшафтном режиме, системы 2008 г.

98

Обратите внимание, что этот вопрос с 2008 года и сейчас представляет только исторический интерес.


Как лучше всего создать приложение для iPhone, которое с самого начала запускалось бы в ландшафтном режиме, независимо от положения устройства?

Как программно, так и с помощью Interface Builder.

Мишель де Маре
источник
5
Для будущих читателей, обратите внимание, что эта знаменитая проблема теперь РЕШЕНА Apple по состоянию на 2011 год. Обратите внимание на тестовый проект в ответе ниже.
Fattie

Ответы:

47

Только исторический ответ. Эффектно устарел.

Обратите внимание, что этот ответ сейчас сильно устарел /

Этот ответ - лишь историческое любопытство .


Волнующие новости! Как обнаружил Эндрю ниже, эта проблема была исправлена ​​Apple в версии 4.0+.

Похоже, больше нет необходимости увеличивать размер представления для каждого вида, и конкретная серьезная проблема ландшафта, «работающего только в первый раз», была решена.

По состоянию на апрель 2011 года невозможно протестировать или даже построить что-либо ниже 4.0, поэтому вопрос является чисто историческим курьезом. Невероятно, сколько хлопот это доставляло разработчикам так долго!


Вот исходное обсуждение и решение. Сейчас это совершенно неактуально, поскольку эти системы даже не работают.


ЧРЕЗВЫЧАЙНО СЛОЖНО заставить эту работу работать полностью - есть как минимум три проблемы / ошибки.

попробуйте это .. конструктор интерфейсов ландшафтный дизайн

В частности, обратите внимание, что там, где говорится «и вам нужно правильно использовать shouldAutorotateToInterfaceOrientation везде», это означает везде, во всех ваших полноэкранных представлениях.

Надеюсь, это поможет в этом кошмаре!

Важное напоминание о ДОПОЛНИТЕЛЬНОЙ хорошо известной проблеме: если вы пытаетесь переключиться между БОЛЕЕ ОДНИМ видом (все альбомные), ЭТО ПРОСТО НЕ РАБОТАЕТ . Об этом важно помнить, иначе вы потратите дни на решение проблемы. Это буквально НЕ ВОЗМОЖНО. Это самая большая открытая и известная ошибка на платформе iOS. Буквально невозможно заставить аппаратное обеспечение делать второй вид, который вы загружаете, альбомным. Раздражающий, но простой обходной путь, и то, что вы должны сделать, - это иметь тривиальный главный UIViewController, который ничего не делает, кроме как сидит и позволяет вам переключаться между вашими представлениями.

Другими словами, в iOS из-за серьезной ошибки знания:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

Вы можете сделать это только один раз . Позже, если вы попытаетесь удалить happyThing.view и вместо этого вставить newThing.view, ЭТО НЕ РАБОТАЕТ - И ЭТО ТАКОЕ. Аппарат никогда не повернет вид на альбомный. Здесь нет никаких уловок, даже Apple не может заставить это работать. Обходной путь, который вы должны принять, - это иметь общий UIViewController, который просто сидит там и просто хранит ваши различные представления (happyThing, newThing и т. Д.). Надеюсь, поможет!

Толстяк
источник
2
Я считаю, что это было исправлено в 4.x. Мы выпустили игру, в которой было несколько разных экранов, несколько альбомных и портретных, и она просто не работала в 3.x. Не желая использовать дополнительное фиктивное представление, чтобы справиться с этим, мы вместо этого потребовали 4.x - что, вероятно, через год после того, как был задан этот вопрос, вполне нормально.
AndrewS
Мы делали не «всегда пейзаж», а скорее пейзаж или портрет. Каждый VC напрямую добавляется и удаляется из окна. Приложение запускает альбомный режим, остается таким при нескольких переходах экрана. Мы не используем фиктивное представление, но ДЕЙСТВИТЕЛЬНО переопределяем shouldAutorotate на каждом экране. Никаких проблем на 4.x, от сенсорного экрана до планшета и телефона.
AndrewS
41

С сайта Apple Dev:

Чтобы запустить приложение в ландшафтном режиме, чтобы строка состояния сразу находилась в нужном положении, отредактируйте файл Info.plist, добавив ключ UIInterfaceOrientation с соответствующим значением (UIInterfaceOrientationLandscapeRight или UIInterfaceOrientationLandscapeLeft), как показано в листинге 2.

Листинг 2: Запуск вашего приложения в ландшафтном режиме

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Майкл Прайор
источник
5
Этот плюс в ваших методах shouldAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPortrait); и вы сделали.
Майкл Бехан
5
Вопрос спрашивает, как запустить устройство в ландшафтном режиме. Ответы дают эту информацию. Обращение с ориентацией после этого в вопросе не упоминается. +1 Майкл Прайор
ingh.am
1
Любопытно, что "ответ" на самом деле НЕ запускает устройство в альбомном режиме - !! Вероятно, это самая известная ошибка / сложность во всей среде Apple. Это базовый вариант для очень работающего разработчика iPad!
Fattie
@mbehan Существует также UIInterfaceOrientationPortraitUpsideDown, поэтому это не исправление. Кроме того, UIInterfaceOrientation в .plist поддерживается только на устройствах версии 3.2+, но не на устройствах версии 3.1.3 и старше (и помните, что iPhone 2G застрял на этой версии).
Иван Вучица
28

Резюме и интеграция со всех постов, после тестирования на себе; проверьте обновление для 4.x, 5.x ниже.

Начиная с версии 3.2, вы не можете изменить ориентацию запущенного приложения из кода.

Но вы можете запустить приложение с фиксированной ориентацией, хотя сделать это непросто.

Попробуйте по этому рецепту:

  1. установите свою ориентацию UISupportedInterfaceOrientationsв Info.plistфайле
  2. в вашем окне определите «контроллер базового вида» 480x320. Любое другое представление будет добавлено в качестве подвида к его представлению.
  3. во всех контроллерах представления настроить shouldAutorotateToInterfaceOrientation:метод (конечно, чтобы вернуть то же значение, которое вы определили в plist)
  4. во всех контроллерах представления установите фоновое представление с

    self.view.frame = CGRectMake(0, 0, 480, 320)

    в viewDidLoadметоде.

Обновление (iOS 4.x, 5.x) : в Руководстве по программированию приложений Apple iOS есть параграф «Запуск в ландшафтном режиме» в главе «Расширенные приемы работы с приложениями».

Ссылки:

IlDan
источник
1
Могу подтвердить, что это единственное действительно рабочее решение (с небольшим дополнением). Мне потребовались часы, чтобы найти и оценить это. Все остальные ответы являются лишь частичным решением проблемы.
Йоханнес Рудольф
8

Сначала установил в info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

затем я помещаю этот код в applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

Таким образом, я могу работать с представлением в Интерфейсном Разработчике в ландшафтном режиме.

Самвермет
источник
7

Ответ sasb и michaelpryor кажется правильным, но если он не работает для вас, попробуйте эту альтернативу:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

Или вот этот:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Или вот этот:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Возможно, вам также придется window makeKeyAndVisible;сначала позвонить .

Несколько ссылок: Разработка в ландшафтном режиме , iPhone SDK: как установить только ландшафтный режим?

@Robert: см . IPhone SDK, NDA и Stack Overflow .

Сорен Куклау
источник
6

Я удивлен, что никто еще не придумал этот ответ:

Во всех моих тестах при отклонении модального контроллера представления, установленная предпочтительная ориентация родительского контроллера shouldAutorotateToInterfaceOrientationпредставления соблюдается, даже если он является частью UINavigationController. Итак, решение простое:

Создайте фиктивный UIViewController с UIImageView для фона. Установите в качестве изображения изображение default.png, которое ваше приложение использует при запуске.

Когда viewWillAppearвызывается в корневом контроллере представления, просто представьте фиктивный контроллер представления без анимации.

когда viewDidAppearвызывается в вашем фиктивном контроллере представления, отключите контроллер представления с красивой анимацией перекрестного растворения.

Это не только работает, но и хорошо выглядит! Кстати, просто для пояснения я делаю контроллер корневого представления viewWillAppearследующим образом:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}
Арлен Андерсон
источник
5

В последней версии Руководства по программированию для iPhone OS есть полный раздел с примерами кода. Я уверен, что это недавнее дополнение, так что, возможно, вы его пропустили. В нем объясняются все условия, которые вы должны соблюдать; в принципе...

  • установить свойства Info.plist (это изменяет положение строки состояния, но не вид)
  • поверните представление вручную вокруг его центра либо в методе UIViewController viewDidLoad:, либо в методе applicationDidFinishLaunching: либо реализуйте автоматическое вращение («Автоматическое изменение размеров поведения», стр. 124)

Найдите «Запуск в ландшафтном режиме», стр. 102.


источник
4

См. Этот ответ: Ландшафтный режим ТОЛЬКО для iPhone или iPad

  1. добавить ориентацию в список
  2. shouldAutorotateToInterfaceOrientation = YES во всех файлах

Хотя, если вы используете смешанные режимы, вам может быть лучше с

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Nicc
источник