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

StackOverflow https://stackoverflow.com/questions/1891395

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

В обоих 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

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

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

Это было полезно?

Решение

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

- (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 в методе mustAotorotate для второго представления.Или попробуйте сделать это в портретном режиме в ИБ.Кажется, ваш вид был загружен правильно (в ландшафтном режиме), но затем получил сообщение mustAutorotate и был повернут на 90 градусов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top