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

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


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

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

Ответов (8)

Решение

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

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

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


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

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

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


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


КРАЙНЕ ТРУДНО заставить эту работу полноценно работать - есть как минимум три проблемы / ошибки.

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

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

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

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

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

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

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

С сайта Apple Dev:

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

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

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

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

Использованная литература:

Ответ 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 .

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

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

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

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

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

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

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

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

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