Приложение iPhone только для альбомной ориентации с несколькими кончиками

Я разрабатываю приложение для iPhone, которое имеет несколько перьев и должно быть только в альбомной ориентации.

Приложение настроено на запуск в ландшафтном режиме через файл Info.plist.

У меня есть два вида контроллеров:FirstViewController а также SecondViewController,

Для каждого из них у меня есть файл пера, где вид в альбомной ориентации. Оба вида контроллеров добавлены в мой MainView перья как розетки, и их взгляды лениво инициализируются.

Когда приложение загружается, первое представление отображается в альбомной ориентации, как и ожидалось. Однако, когда я переключаюсь на второй вид, устройство (или симулятор) остается в альбомной ориентации, но вид поворачивается, как если бы устройство находилось в портретном режиме, что тормозит мой интерфейс.

В обоих UIViewController классы у меня есть следующий код:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

и для переключения представлений в моем приложении делегата я делаю:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

где viewController а также secondViewController являются двумя выходами, где контроллеры представления связаны.

Вот как выглядит второй вид в IB: http://img27.imageshack.us/img27/4898/picture1ni.png

и вот как это выглядит в симуляторе: http://img402.imageshack.us/img402/4866/picture2wt.png

Почему второй вид отображается в альбомной ориентации, но с повернутым интерфейсом?

Я не хотел бы иметь дело со свойствами преобразования, так как это кажется излишним.

2 ответа

Решение

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

- (void)forceLandscapeForView:(UIView *)theView {
  theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
  theView.bounds = CGRectMake(0, 0, 480, 320);
  theView.center = CGPointMake(160, 240);
  [theView setNeedsLayout];
  [theView setNeedsDisplay];
}

Затем, когда вы добавляете новый вид, проверьте текущую ориентацию и при необходимости принудительно поверните:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
  [self forceLandscapeForView:_activeViewController.view];
}

Тогда, конечно, вы хотите ответить соответствующим образом shouldAutorotateToInterfaceOrientation в каждом из ваших контроллеров представления:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

Я хотел бы услышать об альтернативных решениях, если это не все необходимо. Есть также одна оговорка, которую я заметил с этой настройкой: если у вас есть переход между видами, и вы поворачиваете телефон во время этого перехода, возможно, ориентации видов могут быть перевернуты или "застряли" на неправильной ориентации ландшафта, например что вам нужно перевернуть телефон (пейзаж-вправо против пейзажа-влево) при навигации между видами.

Это всего лишь предложение, но вы можете попытаться вернуть NO в методе shouldAotorotate для второго представления. Или попробуйте сделать это в портретном виде в ИБ. Кажется, что ваш вид был загружен правильно (в альбомной ориентации), но затем получил сообщение "Должен быть автор" и был повернут на 90 градусов.

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