AVPlayer resizeAspect правильно работает только на iPhone X

resizeAspect, так как гравитация видео у меня работает правильно только при использовании iPhone X.

По некоторым причинам черная полоса отображается только сверху, а не снизу. Вот как это выглядит, когда я не использую iPhone X (изображение белого цвета)

iphone

Вот как это должно выглядеть:

нормальное состояние

Как вы можете видеть, на iPhone X все выглядит чисто и сбалансировано, как и ожидалось.

Вот как я играю видео:

    avPlayerLayer = AVPlayerLayer(player: avPlayer)
    avPlayerLayer.frame = PreviewLayer.bounds
    avPlayerLayer.videoGravity = .resizeAspect //Will automatically add black bars


    PreviewLayer.layer.insertSublayer(avPlayerLayer, at: 0)
    let playerItem = AVPlayerItem(url: video)
    avPlayer?.replaceCurrentItem(with: playerItem)
    avPlayer?.play()

2 ответа

Решение

Сделайте ваш videoLayer Просмотр подпредставления:

class VideoContainerView: UIView {

    var playerLayer: CALayer?

    override func layoutSublayers(of layer: CALayer) {
        super.layoutSublayers(of: layer)
        playerLayer?.frame = self.bounds
    }

}

и добавить:

self.VideoShareLayer.playerLayer = avPlayerLayer;

перед вставкой слоя.

Попробуйте это шаги

1- Проверьте нижнее ограничение, соедините с сейфом

2- Попробуйте этот код

import UIKit
import AVKit

class ViewController: UIViewController {
    @IBOutlet weak var playerView: UIView!
    private var player: AVPlayer!

    override func viewDidLoad() {
        super.viewDidLoad()
       playVideo(from: "Intro.mp4")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    private func playVideo(from file:String) {
        let file = file.components(separatedBy: ".")

        guard let path = Bundle.main.path(forResource: file[0], ofType:file[1]) else {
            debugPrint( "\(file.joined(separator: ".")) not found")
            return
        }

        player = AVPlayer(url: URL(fileURLWithPath: path))

        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player.currentItem, queue: .main) { _ in
            self.player?.seek(to: kCMTimeZero)
            self.player?.play()
        }

        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
        playerLayer.frame = playerView.layer.bounds
        playerView.layer.insertSublayer(playerLayer, at: 0)
        player.play()
    }

}

Результат на iphone X

Результат на iphone 7

Примечание: если вам нужен полный просмотр видео на всех устройствах, попробуйте связать Bottom constraint а также Top constraint с суперпредставлением не с безопасной зоной

Другие вопросы по тегам