Настройка AVPlayerLayer VideoGravity работает на симуляторе, а не на iPad - PullRequest
8 голосов
/ 23 марта 2012

В настоящее время я разрабатываю видеоплеер для потокового контента с использованием AVPlayer Framework.Я наткнулся на свойство строки VideoGravity AVPlayerLayer's VideoGravity, которое позволило бы мне установить режим масштабирования / изменения размера проигрывателей на разные значения.

Чтобы предоставить пользователю функции масштабирования, известные из проигрывателя по умолчанию,Мы настроили метод, который выполнял бы следующий код:

AVPlayerLayer *layer = (AVPlayerLayer *)[self.videoContainer layer];

if([layer.videoGravity isEqualToString:AVLayerVideoGravityResizeAspect])
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
else 
    layer.videoGravity = AVLayerVideoGravityResizeAspect;

Это очень хорошо работает в симуляторе, но почему-то не на моем iPad 2 с установленной iOS 5.0.1.

Имееткто-нибудь испытывал подобные проблемы?Это известная ошибка iOS с 5.0.1?Есть ли лучший подход для реализации масштабирования / изменения размера с помощью AVPlayerLayer?

Любые идеи / советы / помощь и рекомендации очень ценятся,

Спасибо,

Сэм

Ответы [ 2 ]

21 голосов
/ 30 марта 2012

Установка границ будет внутренне setNeedsLayout. Вы должны называть это сами, если вы только измените гравитацию. Вызов setNeedsDisplay для принудительного повторного рисования тоже не повредит, хотя я думаю, что AVPlayerLayer обновляет содержимое слоя так часто, что это не будет иметь значения.

РЕДАКТИРОВАТЬ: Ваше имя в два раза лучше, чем мое!

4 голосов
/ 27 марта 2012

Мне наконец-то удалось исправить мою проблему, заменив вышеприведенное утверждение следующим:

    if (self.player.status == AVPlayerStatusReadyToPlay) {
    if([((AVPlayerLayer *)[self.videoContainer layer]).videoGravity isEqualToString:AVLayerVideoGravityResizeAspect])
        ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill;
    else 
        ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspect;

    ((AVPlayerLayer *)[self.videoContainer layer]).bounds = ((AVPlayerLayer *)[self.videoContainer layer]).bounds;
}

установка границ AVPlayerLayer для границы AVPlayerLayer, казалось, сделала свое дело. хотя я не совсем понимаю, почему.

однако: ура для рабочего раствора.

...