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 в разделе Имитированные метрики.

Другие вопросы по тегам