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

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


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

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

Ответ 1

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

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

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


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

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

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


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


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

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

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

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

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

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

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

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

Ответ 2

С сайта Apple Dev:

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

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

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

Ответ 3

Сводка и интеграция со всех должностей, после ее тестирования; проверьте обновление для 4.x, 5.x ниже.

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

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

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

  • установите ориентацию UISupportedInterfaceOrientations в файле Info.plist
  • в вашем окне определите 480x320 "контроллер базового представления". Каждое другое представление будет добавлено в виде подсмотра к его представлению.
  • во всех контроллерах представления настраивается метод shouldAutorotateToInterfaceOrientation: (для возврата того же значения, который вы определили в plist, конечно)
  • во всех контроллерах представления задается фоновое представление с помощью

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

    в методе viewDidLoad.

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

Литература:

Ответ 4

Сначала я установил в 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)]; 

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

Ответ 5

Ответ 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 и переполнение стека.

Ответ 6

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

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

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

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

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

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

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

Ответ 7

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

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

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

Ответ 8

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

  • добавить ориентацию в plist
  • shouldAutorotateToInterfaceOrientation = YES во всех файлах

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];