Как убедиться, что мое представление правильно ориентировано после полноэкранного видео?
У меня есть универсальное приложение 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
Мне этот последний скриншот не похож на проблему изменения ориентации.
Панель навигации в основном отключена высотой строки состояния.
Возможно, ваш расчет позиции завершился неудачно, потому что вы используете рамку представления
в то время как полноэкранное видео (без строки состояния) воспроизводится, и это завершается с ошибкой, как только
строка состояния вернулась?