Приложение для iPhone в ландшафтном режиме, системы 2008 - PullRequest
95 голосов
/ 02 августа 2008

Примечание: этот вопрос относится к 2008 году и в настоящее время представляет только исторический интерес.


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

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

Ответы [ 8 ]

46 голосов
/ 28 марта 2010

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

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

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


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

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

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


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


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

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

Обратите внимание, в частности, на то, что там, где написано ", и вам нужно правильно использовать вездеAutorotateToInterfaceOrientation везде" это означает везде, все ваши полноэкранные просмотры.

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

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

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

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

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

40 голосов
/ 31 августа 2008

с сайта Apple Dev:

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

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

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
27 голосов
/ 07 мая 2010

Сводка и интеграция со всех постов, после того как я сам ее протестировал; проверьте обновление для 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 есть раздел «Запуск в ландшафтном режиме» в главе «Дополнительные приемы приложения».

Ссылки:

7 голосов
/ 20 ноября 2009

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

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

тогда я положил этот код в приложение DidFinishLaunching:

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)]; 

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

6 голосов
/ 31 августа 2008

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

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

Или вот этот:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Или вот этот:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

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

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

@ Роберт: см. iPhone SDK, NDA и переполнение стека .

5 голосов
/ 27 ноября 2010

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

Во всех моих тестах при отклонении модального контроллера представления предпочтительная ориентация родительского контроллера представления, установленная в 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;
 }
...
}
4 голосов
/ 05 сентября 2008

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

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

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

3 голосов
/ 06 марта 2011

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

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...