2009-02-08 9 views
4

Я пытаюсь создать приложение iPhone, которое всегда находится в ландшафтном режиме, используя шаблон приложения Utility. Вот что я сделал:iPhone-приложение для использования только для ландшафтных приложений

  • Создать новый проект iPhone приложения, используя шаблон утилиты Application
  • В Interface Builder, вращать все мнения 90 градусов.
  • В Interface Builder добавьте метку в середину MainView. Протяните его по всему виду, установите выравнивание по центру и установите пружины автозапуска так, чтобы он мог растягиваться горизонтально.
  • В Info.plist, добавьте ключ "UIInterfaceOrientation" со значением "UIInterfaceOrientationLandscapeRight"
  • в классах контроллеров, изменить методы shouldAutorotateToInterfaceOrientation "вернуться (interfaceOrientation == UIInterfaceOrientationLandscapeRight) || (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);"
  • Запуск приложения.

Когда я запускаю свое приложение, оно появляется в альбомной ориентации, но основной вид охватывает только верхнюю половину дисплея, и он растягивается горизонтально. Я получаю одинаковые результаты как в симуляторе, так и на реальном устройстве. Я видел его с версиями 2.2 и 2.2.1 SDK.

Я был в состоянии обойти эту проблему, добавив следующий шаг выше:

  • Add «self.view.autoresizesSubviews = NO;» к методу viewDidLoad RootViewController после "[super viewDidLoad];".

Если я это сделаю, то он будет работать, как ожидалось. Но это похоже на хак. Зачем это нужно?

Я не думаю, что это проблема трансформации. Все элементы рисуются в правильной ориентации и с правильным масштабированием. Проблема заключается в том, что прямоугольники границ основного вида становятся фанки. Похоже, что высота основного вида сокращается чуть более чем наполовину, а ширина увеличивается примерно на 50%.

Если я делаю то же самое множество шагов, используя шаблон приложения на основе View, а не Utility, тогда все работает так, как ожидалось. Поэтому я уверен, что проблема связана с тем, как приложение Utility управляет своими представлениями.

Кто-нибудь понимает, что здесь происходит?

+0

Вид глупых вопросов, но есть ли правильный размер в IB? –

+0

Да, размер правильный. –

+0

Пожалуйста, ознакомьтесь с Пейзаж FAQ для ответа на ваш вопрос: http://stackoverflow.com/questions/2953351/iphone-landscape-faq-and-solutions –

ответ

3

Я собирался сказать, что установка этой клавиши не поворачивает ваш интерфейс; вам все равно нужно выложить свой контент в ландшафтном режиме и выполнить соответствующее вращение с помощью 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;  
} 
+0

Я использую iPhone OS 2.2.1. Я попробовал преобразование, которое вы предложили, но ничего не изменилось. FWIW, я не думаю, что это трансформация, потому что все проявляется в правильной ориентации и с правильным масштабированием, но кажется, что прямоугольник границ всего отключен. –

2

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

0

Попробуйте настроить свойство ориентации вида на Пейзаж в наконечнике. Это свойство можно найти на 4-й вкладке [Attributes Inspector] Info View UIView в моделированных метриках.