Додаток iPhone у ландшафтному режимі, 2008 р


98

Зверніть увагу, що це питання з 2008 року і зараз цікавить лише історичну ситуацію.


Який найкращий спосіб створити додаток для iPhone, який запускається в альбомному режимі з самого початку, незалежно від положення пристрою?

Як програмно, так і за допомогою Інтерфейсу.


5
Будь-яким майбутнім читачам, будь ласка, зауважте, що ця відома проблема вирішена Apple станом на 2011 рік. Зверніть увагу на тестовий проект у відповіді нижче.
Fattie

Відповіді:


47

Лише історична відповідь. Виразно застаріла.

Зауважте, що ця відповідь зараз сильно застаріла /

Ця відповідь є лише історичною цікавістю .


Захоплюючі новини! Як виявив Ендрю нижче, ця проблема була усунена Apple у версії 4.0+.

Здавалося б, НІКОЛИ більше не потрібно форсувати розмір погляду на кожному огляді, і конкретна серйозна проблема ландшафту, "що працює тільки в перший раз", була вирішена.

Станом на квітень 2011 року неможливо протестувати або навіть побудувати що-небудь нижче 4,0, тому питання суто історичне цікавість. Неймовірно, скільки неприємностей це стільки часу завдало розробникам!


Ось оригінальна дискусія та рішення. Зараз це абсолютно не має значення, оскільки ці системи навіть не функціонують.


Надзвичайно важко зробити цю роботу повною мірою - у грі є як мінімум три проблеми / помилки.

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

Зокрема, зауважте, що там, де написано "і вам потрібно правильно використовувати скрізь скрізь" AutoAutorotateToInterfaceOrientation ", це означає всюди, усі ваші перегляди на повноекранному екрані.

Сподіваюся, це допомагає в цьому кошмарі!

Важливе нагадування про ДОБАВЛЕННУ добре відому проблему тут: якщо ви намагаєтесь обмінятись на БІЛЬШИЙ ОДИН Огляд (весь пейзаж), ПРОСТО НЕ ПРАЦЮЄ . Важливо пам’ятати про це, або ви витратите дні на проблему. Це буквально НЕ МОЖЛИВО. Це найбільша відкрита, відома помилка на платформі iOS. Буквально немає способу змусити обладнання зробити другий вигляд, який ви завантажуєте, бути пейзажним. Набридлий, але простий спосіб вирішення, і що ви повинні зробити, - це тривіальний майстер UIViewController, який нічого не робить, крім того, щоб сидіти там і дозволяти вам обмінятися думками.

Іншими словами, в iOS через основну помилку знань:

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

Це можна зробити лише один раз . Пізніше, якщо ви спробуєте видалити happyThing.view, і замість цього помістити туди newThing.view, він НЕ ПРАЦЮЄ - А ТО ЩЕ. Машина ніколи не повертатиме погляд на пейзаж. Немає жодної витівки, навіть Apple не може змусити її працювати. Ви повинні вирішити проблему створення загального UIViewController, який просто сидить там і просто містить різні погляди (happyThing, newThing тощо). Сподіваюся, це допомагає!


2
Я вважаю, що це було виправлено у 4.x. Ми поставили гру, яка мала купу різних екранів, трохи пейзажу та портрет, і вона просто не спрацювала в 3.x. Не бажаючи потрапляти в додатковий фіктивний вигляд, щоб впоратися з цим, ми замість цього вимагали 4.x - що через рік після цього запитання було, мабуть, нормально.
AndrewS

Ми не робили "завжди пейзаж", а по-різному пейзаж чи портрет. Кожен ВК безпосередньо додається до вікна та видаляється з нього. Додаток запускає пейзаж, залишається таким шляхом через кілька переходів екрану. Ми не використовуємо фіктивний вигляд, але ми переосмислюємо функціюАвторотація на кожному екрані Немає проблем на 4.x, від сенсорної панелі до телефону.
AndrewS

41

З сайту Apple Dev:

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

Лістинг 2: Запуск програми в альбомному режимі

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

5
Цей плюс у ваших методах returnAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPor Portrait); і ви закінчили.
Майкл Бехан

5
Питання задає питання, як запустити пристрій у альбомному режимі. Відповіді дає таку інформацію. Орієнтація на обробку після цього не зазначається у питанні. +1 Майкл Прайор
ingh.am

1
Інтригуюче, що "відповідь" насправді НЕ запустить пристрій у ландшафтному режимі - !! Це, мабуть, є однією з найвідоміших помилок / труднощів у всіх середовищах Apple. Це основна для дуже працюючого розробника iPad!
Fattie

@mbehan Існує також UIInterfaceOrientationPor PortraitUpsideDown, отже, не виправлення. Крім того, UIInterfaceOrientation в .plist підтримується лише на 3.2+, а не на пристроях 3.1.3 і старших версій (і пам’ятайте, що iPhone 2G застряг у цій версії).
Іван Вучиця

28

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

Список літератури:


1
Я можу підтвердити, що це єдине, справді робоче рішення (з невеликим доповненням). Щоб знайти та оцінити це, мені знадобилися години. Усі інші відповіді - це лише часткові рішення проблеми.
Йоганнес Рудольф

8

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

Таким чином я можу працювати над поданням в Інтерфейс Builder в ландшафтному режимі.


7

Відповідь 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;
 }
...
}

5

В останньому посібнику з програмування iPhone OS є повний розділ про це із зразком коду. Я впевнений, що це нещодавнє доповнення, тому, можливо, ви його пропустили. Це пояснює всі умови, які ви повинні виконувати; в основному ...

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

Шукайте "Запуск у альбомному режимі", стор. 102.


4

Дивіться цю відповідь: Пейзажний режим ТІЛЬКИ для iPhone або iPad

  1. додати орієнтацію на пліст
  2. shouldAutorotateToInterfaceOrientation = ТАК у всіх файлах

Хоча якщо ви використовуєте змішані режими, вам може бути краще

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.