Сведения о вопросе

Henry

16:03, 1st July, 2020

Теги

ios   objective-c   landscape    

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

Просмотров: 398   Ответов: 8

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


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

Как программно, так и с помощью конструктора интерфейсов.



  Сведения об ответе

P_S_S

18:03, 1st July, 2020

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

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

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


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

Казалось бы, что NO больше не нужно навязывать размер вида на каждом виде, и конкретная серьезная проблема ландшафта "only working the first time" была решена.

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


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


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

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

Обратите внимание, в частности, что там, где он говорит "and you need to use shouldAutorotateToInterfaceOrientation properly everywhere" , это означает везде, все ваши полноэкранные представления.

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

Важное напоминание о хорошо известной проблеме ADDITIONAL здесь: Если вы пытаетесь переключиться между несколькими видами (все ландшафты), это просто не работает . Очень важно помнить об этом, иначе вы будете тратить дни на эту проблему. Это буквально невозможно. Это самая большая открытая, известная ошибка на платформе iOS. Нет буквально никакого способа заставить аппаратное обеспечение сделать второй вид, который вы загружаете, ландшафтным. Раздражающий, но простой обходной путь, и то, что вы должны сделать, - это иметь тривиальный мастер UIViewController, который ничего не делает, но сидит там и позволяет вам обмениваться мнениями.

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

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

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


  Сведения об ответе

KOMP

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

dump

18:03, 1st July, 2020

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

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

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

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

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

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

    в методе viewDidLoad .

Обновление (iOS 4.x, 5.x): руководство по программированию приложений Apple iOS содержит пункт "Launching in Landscape Mode" в главе "Advanced App Tricks".

Рекомендации:


  Сведения об ответе

KOMP

18:03, 1st July, 2020

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


  Сведения об ответе

screen

18:03, 1st July, 2020

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


  Сведения об ответе

ASER

18:03, 1st July, 2020

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

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


  Сведения об ответе

ЯЯ__4

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

repe

18:03, 1st July, 2020

Смотрите этот ответ: ландшафтный режим ONLY для iPhone или iPad

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться