Как убедиться, что мое представление правильно ориентировано после полноэкранного видео?

У меня есть универсальное приложение ipad/iphone, которое позволяет пользователю смотреть видео, которое затем можно развернуть в полноэкранном режиме.

Я реализовал (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration, и в этом методе я выполняю различные вызовы setFrame в моих элементах представления в зависимости от того, находятся ли они в альбомной или портретной ориентации.

Это, кажется, работает нормально при нормальном использовании, т.е. вращение назад и вперед отлично работает.

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

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

Странная часть, я реализовал (void)exitedFullscreen:(NSNotification*)notification, и там я распечатываю ориентацию, и она видна правильно. Я также вызываю свой код в reset элементы представления, основанные на текущей ориентации, и у меня по-прежнему возникает эта проблема.

Другая связанная с этим проблема иногда связана с вращением, мои взгляды оказываются слишком далеко по экрану, фактически переходящие под панель состояния в верхней части устройства.

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

Navigation bar goes underneath status bar after rotation during full screen video.

Ответ 1

Ваш контроллер ViewController может не вращаться, потому что другой контроллер является первым ответчиком. Что бы вы могли сделать, чтобы избежать этого, зарегистрируйте контроллер вида на изменения вращения устройства и осуществите вращение в селекторе, который вы вызываете, когда получаете такое уведомление.

В appDelegate:

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

В вашем представлении контроллер

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)name:UIDeviceOrientationDidChangeNotification object:nil]; 

В режиме поворота вы можете проверить ориентацию с помощью

    [[UIDevice currentDevice] orientation]

Ответ 2

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

Обратитесь к Kenny answer at Проблема pushViewController от Пейзаж до Портрета

Ответ 3

Панель навигации в верхней части окна. Я решил это, используя этот код →

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];

Используя это после вашего вращения.

Ответ 4

Мейсон, вы вошли в систему и проверили, будет ли ваш метод willAnimateRotationToInterfaceOrientation: duration: вызывается после каждого перехода состояния?

Ответ 5

Ваша ориентация может не обновиться должным образом, если есть другой контроллер, действующий как первый ответчик. Лучший способ преодолеть это - вызвать функции, которые вы используете для ориентации экрана по методу viewWillAppear:, используя текущую ориентацию контроллера вида: [self interfaceOrientation]

Если вы используете подклассы subview, вам может потребоваться переопределить макет метокSubviews и вызвать setNeedsLayout. Еще одна вещь, которая может быть причиной этого, заключается в том, чтобы уйти в отставку с помощью viewcontroller, где у вас есть видео в качестве первого ответчика (вы просматриваете поиск, если где-то вы используете methon resignfirstresponder и попробуйте, как он работает без него). Если это не сработает, я не знаю, это может быть очень сложно и зависит от того, как вы его реализовали. Но для вещей, которые вы говорите, вы не нуждаетесь в большом количестве кода, поскольку автоматическое вращение и изменение размеров представлений обрабатывается теперь инспектором размеров редактора представлений.

Я думаю, что это нужно делать.

Ответ 6

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

Возможно, ваш расчет позиции завершился неудачно, потому что вы используете рамку представления в то время как полноэкранное видео (без строки состояния) воспроизводится, и это завершается с ошибкой, как только строка состояния вернулась?