iPhone-Only-Utility-шаблон приложения - PullRequest
4 голосов
/ 08 февраля 2009

Я пытаюсь создать приложение для 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 ]

3 голосов
/ 08 февраля 2009

Я собирался сказать, что установка этого ключа не вращает ваш интерфейс; вам все еще нужно выложить содержимое в альбомном режиме и выполнить соответствующее вращение с помощью CFAffineTransform - см. «Запуск в ландшафтном режиме» в Руководстве по программированию iPhone OS. Собираясь найти ссылку для вас, я нашел этот комментарий: «Чтобы запустить приложение на основе контроллера представления в альбомном режиме в версиях iPhone OS до v2.1, вам нужно применить поворот на 90 градусов для преобразования приложения. корневое представление в дополнение ко всем предыдущим шагам. До iPhone OS 2.1 контроллеры представления не поворачивали свои представления автоматически на основе значения ключа UIInterfaceOrientation. Однако этот шаг не является необходимым в iPhone OS 2.1 и более поздних версиях. "

Так что, если вы используете pre-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;    
}
2 голосов
/ 08 февраля 2009

Джейн описывает установку 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 и в симуляторе.

0 голосов
/ 11 ноября 2011

Попробуйте установить для свойства ориентации вида значение Пейзаж в кончике. Это свойство можно найти на четвертой вкладке [Инспектор атрибутов] информационного представления UIView в разделе Имитированные метрики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...