iPhone-Only-Utility-шаблон приложения
Я пытаюсь создать приложение для iPhone, которое всегда находится в ландшафтном режиме, используя шаблон приложения Utility. Вот что я сделал:
- Создайте новый проект приложения iPhone, используя шаблон Utility Application.
- В Интерфейсном Разработчике поверните все представления на 90 градусов.
- В Интерфейсном Разработчике добавьте метку к середине MainView. Растяните его по всему виду, установите выравнивание по центру и установите пружины с автоматическими размерами, чтобы они могли растягиваться по горизонтали.
- В Info.plist добавьте ключ "UIInterfaceOrientation" со значением "UIInterfaceOrientationLandscapeRight"
- В классах контроллера измените методы shouldAutorotateToInterfaceOrientation на "return (interfaceOrientation == UIInterfaceOrientationLandscapeRight) || (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);"
- Запустите приложение.
Когда я запускаю свое приложение, оно появляется в горизонтальной ориентации, но основной вид охватывает только верхнюю половину экрана и растягивается горизонтально. Я получаю одинаковые результаты как на симуляторе, так и на реальном устройстве. Я видел это с версиями 2.2 и 2.2.1 SDK.
Я смог обойти эту проблему, добавив следующий шаг к вышеуказанному:
- Добавьте "self.view.autoresizesSubviews = NO;" в метод viewDidLoad RootViewController после "[super viewDidLoad];".
Если я это сделаю, то все работает как положено. Но это похоже на взлом. Зачем это нужно?
Я не думаю, что это проблема трансформации. Все элементы нарисованы в правильной ориентации и с правильным масштабированием. Кажется, проблема в том, что прямоугольники границ основного вида становятся фанки. Похоже, что высота основного вида уменьшается чуть больше половины, а ширина увеличивается примерно на 50%.
Если я сделаю точно такой же набор шагов, используя шаблон приложения на основе представления вместо утилиты, то все будет работать как положено. Поэтому я уверен, что проблема связана с тем, как приложение Utility управляет своими представлениями.
Кто-нибудь понимает, что здесь происходит?
3 ответа
Я собирался сказать, что установка этого ключа не вращает ваш интерфейс; вам все еще нужно выложить содержимое в альбомном режиме и выполнить соответствующее вращение с помощью CFAffineTransform - см. "Запуск в ландшафтном режиме" в Руководстве по программированию iPhone OS. Собираясь найти ссылку для вас, я нашел этот комментарий: "Чтобы запустить приложение на основе контроллера представления в альбомном режиме в версиях iPhone OS до v2.1, вам нужно применить поворот на 90 градусов для преобразования приложения корневое представление в дополнение ко всем предшествующим шагам. До iPhone OS 2.1 контроллеры представления не поворачивали свои представления автоматически на основе значения ключа UIInterfaceOrientation. Однако этот шаг не является необходимым в iPhone OS 2.1 и более поздних версиях ".
Поэтому, если вы работаете до версии 2.1, вам нужно добавить этот код в ваш метод viewDidLoad в вашем контроллере представления. (В противном случае, вы можете опубликовать код?)
-(void)viewDidLoad
// After loading the view, transform the view so that the co-ordinates are right for landscape
// As described in iPhone Application Programming Guide
// Weird, I'm sure this used to be needed, but it doesn't now. The one in CardScrollViewController is needed though.
{
[super viewDidLoad];
CGAffineTransform transform = self.view.transform;
CGPoint center = CGPointMake(kScreenHeight / 2.0, kScreenWidth / 2.0);
// Set the center point of the view to the center point of the window's content area.
self.view.center = center;
// Rotate the view 90 degrees around its new center point.
transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
self.view.transform = transform;
}
Джейн описывает настройку UIInterfaceOrientation для UIInterfaceOrientationLandscapeRight (или UIInterfaceOrientationLandscapeLeft) и настройки поворота, рекомендованные в документации, но я использовал немного другой блок кода (с той же целью) в моем контроллере корневого представления:
- (void)loadView
{
UIView *primaryView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
primaryView.backgroundColor = [UIColor clearColor];
// Start in landscape orientation, and stay that way
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationLandscapeRight)
{
CGAffineTransform transform = primaryView.transform;
// Use the status bar frame to determine the center point of the window's content area.
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect bounds = CGRectMake(0, 0, statusBarFrame.size.height, statusBarFrame.origin.x);
CGPoint center = CGPointMake(60.0, bounds.size.height / 2.0);
// Set the center point of the view to the center point of the window's content area.
primaryView.center = center;
// Rotate the view 90 degrees around its new center point.
transform = CGAffineTransformRotate(transform, (M_PI / 2.0));
primaryView.transform = transform;
}
self.view = primaryView;
[primaryView release];
}
В дополнение к этому я реализовал следующий метод делегата в моем корневом контроллере представления:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return ( (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}
Наконец, я столкнулся со странными сбоями в симуляторе с неправильным автоматическим вращением, поэтому мне нужно было реализовать следующий метод делегата в моем UIApplicationDelegate:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
{
// This prevents the view from autorotating to portrait in the simulator
if ((newStatusBarOrientation == UIInterfaceOrientationPortrait) || (newStatusBarOrientation == UIInterfaceOrientationPortraitUpsideDown))
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
}
После всего этого мое приложение могло запускаться в альбомной ориентации (справа) и оставаться в этой ориентации под прошивкой 2.0 и в симуляторе.
Попробуйте установить свойство ориентации вида "Пейзаж" в кончике. Это свойство можно найти на 4-й вкладке [Инспектор атрибутов] информационного представления UIView в разделе Имитированные метрики.