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