AVKit.AVPlayerViewController — элементы управления не видны в iOS11 и выше.

У меня есть видеоплеер с элементами управления. Они не видны с iOS11 + без проблем до iOS10

Это демонстрация симулятора iPhone8.

демонстрация iPhone 8

Это демонстрация симулятора iPhoneX. Элементы управления не отображаются в нижней части проигрывателя

демонстрация iPhone X

Я считаю, что это во многом связано с новой безопасной зоной. Мы используем contentOffset (ниже) для смещения сверху. Изменение значения не имеет значения. Нет элементов управления

Это код ниже, который я использую для настройки плеера:

let statusBarHeight: CGFloat = 20
let contentOffset: CGFloat = 50

func setupPlayerView() {
        containerView.addSubview(moviePlayerController.view)
        moviePlayerController.videoGravity = AVLayerVideoGravity(rawValue: AVLayerVideoGravity.resizeAspect.rawValue)
        moviePlayerController.view.sizeToFit()
        moviePlayerController.showsPlaybackControls = true

        moviePlayerController.view.translatesAutoresizingMaskIntoConstraints = false

        if #available(iOS 11.0, *) {
            moviePlayerController.view.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: contentOffset).isActive = true
        } else {
            moviePlayerController.view.topAnchor.constraint(equalTo: topAnchor, constant: statusBarHeight + contentOffset).isActive = true
        }
        NSLayoutConstraint.activate([
            moviePlayerController.view.bottomAnchor.constraint(equalTo: bottomAnchor),
            moviePlayerController.view.leftAnchor.constraint(equalTo: leftAnchor),
            moviePlayerController.view.rightAnchor.constraint(equalTo: rightAnchor)
        ])
    }

Для showPlaybackControls установлено значение True, хотя это значение по умолчанию.

Кто-нибудь еще сталкивался с этой проблемой?


person sandra oo    schedule 05.10.2018    source источник
comment
Я не могу комментировать. Это не имеет особого смысла.   -  person sandra oo    schedule 05.10.2018
comment
Хорошо, добавил это к моему ответу.   -  person matt    schedule 05.10.2018


Ответы (1)


Ваш код всегда был неправильным. Даже в iOS 10 элементы управления находятся внизу экрана, далеко от фильма. Правильный подход состоит в том, чтобы получить naturalSize видеодорожки и использовать его для настройки соотношения сторон экрана проигрывателя, чтобы вид проигрывателя соответствовал размеру фильма. Теперь элементы управления будут отображаться внизу фильма, а не внизу экрана.

Другая проблема в том, что то, что вы делаете, абсолютно незаконно. Вы не можете просто создать AVPlayerViewController, захватить представление контроллера представления и вставить это представление в интерфейс с помощью addSubview. Чтобы сделать контроллер представления дочерним контроллером представления для self (текущего контроллера представления — и вы не выполняете танец, вам не нужно выполнять танец). Вот рабочий пример. :

    let url = // whatever
    let player = AVPlayer(url:url)
    let av = AVPlayerViewController()
    av.player = player
    av.view.frame = // whatever
    self.addChild(av) // <—- LOOK!
    self.view.addSubview(av.view)
    av.didMove(toParent:self) // <— LOOK!

(Обратите внимание, что это Swift 4.2.)

person matt    schedule 05.10.2018
comment
См. github.com/mattneub/Programming -iOS-Book-Examples/blob/master/ для примера. - person matt; 05.10.2018