ios: переместите AVPlayerLayer в полноэкранный режим

У меня есть иерархия представлений, например следующая:

UIViewController
    UIView (Top most view)
        UIView (ContainerView)
            UIView (MoviePlayer.swift) (with layer as AVPlayerLayer)

Файл MoviePlayer опубликован здесь. Теперь я хочу сделать просмотр MoviePlayer полноэкранным. Текущий код не работает, так как представление ограничено другим представлением. Я пытался сделать координату Y отрицательной, но это мало помогает. Каким-то образом этот подход также мешает событиям нажатия кнопок. Другой подход, который я придумал, заключался в том, чтобы показать новый контроллер представления с представлением MoviePlayer, общим для них двух, или что-то в этом роде, но я не знаю, как это сделать. В основном я хочу сделать это, как приложение facebook для iOS, отображаемое в ячейках табличного представления.

Я не хочу использовать MPMoviePlayerController, он уже устарел и использовал его ранее, что имело много проблем и не допускало настройки.

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


person meteors    schedule 11.09.2015    source источник


Ответы (1)


Вы можете попробовать применить CGAffineTransform к своему слою.

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

func CGAffineTransformFromRect(sourceRect: CGRect, toRect finalRect:CGRect) -> CGAffineTransform {
    var transform = CGAffineTransformIdentity
    transform = CGAffineTransformTranslate(transform, -(CGRectGetMidX(sourceRect) - CGRectGetMidX(finalRect)), -(CGRectGetMidY(sourceRect) - CGRectGetMidY(finalRect)))
    transform = CGAffineTransformScale(transform, finalRect.size.width / sourceRect.size.width, finalRect.size.height / sourceRect.size.height)
    return transform
}
person rkyr    schedule 11.09.2015
comment
Итак, я должен изменить размер контейнера представления, содержащего представление MoviePlayer, и применить CGAffineTransform к представлению MoviePlayer - person meteors; 11.09.2015
comment
@метеоры, да. Попробуйте и ответьте, поможет ли это вам. - person rkyr; 11.09.2015
comment
@RK он пытался это сделать. Но это на самом деле растянуло весь вид. На самом деле раньше, когда я менял кадр просмотра MoviePlayer, AVPlayerLayer автоматически занимал доступный кадр, если видео было в портретном режиме. Я прикрепил ссылку на демонстрационный проект github в вопросе. - person meteors; 11.09.2015
comment
@метеоры, извини. Я не правильно вас понял. Здесь я публикую обновленный проект с вашего github. Я не публикую его здесь, потому что там много кода для копирования и вставки. Идея следующая: создать контейнер в ИБ, добавить в этот контейнер своего плеера и применить ограничения к этому плееру (программно). Когда вам нужно изменить размер вашего проигрывателя, вы просто меняете константы ограничений проигрывателя. Также я включаю комментарии в измененные строки. - person rkyr; 11.09.2015
comment
Спасибо @R.K. Я проверю и дам вам знать. - person meteors; 11.09.2015