Приложение для iPhone в ландшафтном режиме, системы 2008 г.
Обратите внимание, что этот вопрос относится к 2008 году и сейчас представляет только исторический интерес.
Как лучше всего создать приложение для iPhone, которое с самого начала запускалось бы в альбомной ориентации, независимо от положения устройства?
Как программно, так и с помощью Interface Builder.
Ответов (8)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, вы не можете изменить ориентацию запущенного приложения из кода.
Но вы можете запустить приложение с фиксированной ориентацией, хотя сделать это непросто.
Попробуйте по этому рецепту:
- установите свою ориентацию
UISupportedInterfaceOrientations
вInfo.plist
файле - в вашем окне определите «контроллер базового вида» 480x320. Любое другое представление будет добавлено как подвид к его представлению.
- во всех контроллерах представления настраивают
shouldAutorotateToInterfaceOrientation:
метод (конечно, чтобы вернуть то же значение, которое вы определили в plist) во всех контроллерах представления установите фоновое представление с
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.
- добавить ориентацию в список
- 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;
}
...
}