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

StackOverflow https://stackoverflow.com/questions/402

  •  08-06-2019
  •  | 
  •  

Вопрос

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


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

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

Это было полезно?

Решение

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

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

Этот пост всего лишь исторический курьёз.


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

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

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


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


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

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

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

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

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

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

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

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

Другие советы

С сайта разработчиков Apple:

Чтобы запустить свое приложение в режиме ландшафта, чтобы строка состояния была в соответствующей позиции немедленно, отредактируйте свой файл info.plist, чтобы добавить ключ UIinterfaceorientation с соответствующим значением (UiInterfaceorationLandScapeRight или UiInterfaceorientationLandScapeleft), как показано в списке 2.

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

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

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

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

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

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

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

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

    в viewDidLoad метод.

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

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

Сначала я установил 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 в ландшафтном режиме.

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

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

Или этот:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Или этот:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

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

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

@Роберт:пожалуйста, обратитесь к iPhone SDK, соглашение о неразглашении и переполнение стека.

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

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

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

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

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

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

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

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

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

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

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

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top