使用 iOS swift 的 AVPlayer 在横向模式下不是全屏
AVPlayer not full screen in landscape mode using iOS swift
我将视频视图设置为全屏。但是在模拟器中玩的时候,不是运行全屏。
此问题仅适用于 iPad,不适用于 iPhone。
这是我的代码:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
let bundle: Bundle = Bundle.main
let videoPlayer: String = bundle.path(forResource: "normalnewer", ofType: "mp4")!
let movieUrl : NSURL = NSURL.fileURL(withPath: videoPlayer) as NSURL
// var fileURL = NSURL(fileURLWithPath: "/Users/Mantas/Desktop/123/123/video-1453562323.mp4.mp4")
playerView = AVPlayer(url: movieUrl as URL)
NotificationCenter.default.addObserver(self,selector: #selector(playerItemDidReachEnd),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: self.playerView.currentItem) // Add observer
var playerLayer=AVPlayerLayer(player: playerView)
// self.avPlayerLayer.playerLayer = AVLayerVideoGravityResizeAspectFill
playerLayer.frame = viewVideo.bounds
// self.playerLayer.frame = self.videoPreviewLayer.bounds
viewVideo.layer.addSublayer(playerLayer)
playerView.play()
UserDefaults.standard.set("normalnewer", forKey: "video")
}
我试过在目标的常规中检查横向模式。
通过以下线程:
how to play a video in fullscreen mode using swift ios?
Setting device orientation in Swift iOS
但是这些都没有解决我的问题。
这是一个截图。
有人可以帮我解决这个问题吗?
花了一些时间仔细查看 Storyboard 后,我尝试将填充更改为 Aspect fill & fit 并解决了问题:)
我看到您解决了问题,但我注意到您使用的是 AVPlayerLayer。方向旋转由 AVPlayerViewController 处理,但不由使用播放器层的自定义视图处理。能够在不旋转设备的情况下将图层全屏显示是很有用的。我在别处回答过这个问题,但我也把它放在这里。
变换和帧操作可以解决这个问题:
extension CGAffineTransform {
static let ninetyDegreeRotation = CGAffineTransform(rotationAngle: CGFloat(M_PI / 2))
}
extension AVPlayerLayer {
var fullScreenAnimationDuration: TimeInterval {
return 0.15
}
func minimizeToFrame(_ frame: CGRect) {
UIView.animate(withDuration: fullScreenAnimationDuration) {
self.setAffineTransform(.identity)
self.frame = frame
}
}
func goFullscreen() {
UIView.animate(withDuration: fullScreenAnimationDuration) {
self.setAffineTransform(.ninetyDegreeRotation)
self.frame = UIScreen.main.bounds
}
}
}
设置 AVPlayerLayer 的框架会改变它的父框架。将原始框架保存在您的视图子类中,以最小化 AVPLayerLayer 回到原来的位置。这允许自动布局。
重要 - 这仅在玩家位于视图子类的中心时有效。
不完整的例子:
class AVPlayerView: UIView {
fileprivate var avPlayerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}
fileprivate var hasGoneFullScreen = false
fileprivate var isPlaying = false
fileprivate var originalFrame = CGRect.zero
func togglePlayback() {
if !hasGoneFullScreen {
originalFrame = frame
hasGoneFullScreen = true
}
isPlaying = !isPlaying
if isPlaying {
avPlayerLayer.goFullscreen()
avPlayerLayer.player?.play()
} else {
avPlayerLayer.player?.pause()
avPlayerLayer.minimizeToFrame(originalFrame)
}
}
}
我将视频视图设置为全屏。但是在模拟器中玩的时候,不是运行全屏。
此问题仅适用于 iPad,不适用于 iPhone。
这是我的代码:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
let bundle: Bundle = Bundle.main
let videoPlayer: String = bundle.path(forResource: "normalnewer", ofType: "mp4")!
let movieUrl : NSURL = NSURL.fileURL(withPath: videoPlayer) as NSURL
// var fileURL = NSURL(fileURLWithPath: "/Users/Mantas/Desktop/123/123/video-1453562323.mp4.mp4")
playerView = AVPlayer(url: movieUrl as URL)
NotificationCenter.default.addObserver(self,selector: #selector(playerItemDidReachEnd),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: self.playerView.currentItem) // Add observer
var playerLayer=AVPlayerLayer(player: playerView)
// self.avPlayerLayer.playerLayer = AVLayerVideoGravityResizeAspectFill
playerLayer.frame = viewVideo.bounds
// self.playerLayer.frame = self.videoPreviewLayer.bounds
viewVideo.layer.addSublayer(playerLayer)
playerView.play()
UserDefaults.standard.set("normalnewer", forKey: "video")
}
我试过在目标的常规中检查横向模式。 通过以下线程: how to play a video in fullscreen mode using swift ios?
Setting device orientation in Swift iOS
但是这些都没有解决我的问题。
这是一个截图。
有人可以帮我解决这个问题吗?
花了一些时间仔细查看 Storyboard 后,我尝试将填充更改为 Aspect fill & fit 并解决了问题:)
我看到您解决了问题,但我注意到您使用的是 AVPlayerLayer。方向旋转由 AVPlayerViewController 处理,但不由使用播放器层的自定义视图处理。能够在不旋转设备的情况下将图层全屏显示是很有用的。我在别处回答过这个问题,但我也把它放在这里。
变换和帧操作可以解决这个问题:
extension CGAffineTransform {
static let ninetyDegreeRotation = CGAffineTransform(rotationAngle: CGFloat(M_PI / 2))
}
extension AVPlayerLayer {
var fullScreenAnimationDuration: TimeInterval {
return 0.15
}
func minimizeToFrame(_ frame: CGRect) {
UIView.animate(withDuration: fullScreenAnimationDuration) {
self.setAffineTransform(.identity)
self.frame = frame
}
}
func goFullscreen() {
UIView.animate(withDuration: fullScreenAnimationDuration) {
self.setAffineTransform(.ninetyDegreeRotation)
self.frame = UIScreen.main.bounds
}
}
}
设置 AVPlayerLayer 的框架会改变它的父框架。将原始框架保存在您的视图子类中,以最小化 AVPLayerLayer 回到原来的位置。这允许自动布局。
重要 - 这仅在玩家位于视图子类的中心时有效。
不完整的例子:
class AVPlayerView: UIView {
fileprivate var avPlayerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}
fileprivate var hasGoneFullScreen = false
fileprivate var isPlaying = false
fileprivate var originalFrame = CGRect.zero
func togglePlayback() {
if !hasGoneFullScreen {
originalFrame = frame
hasGoneFullScreen = true
}
isPlaying = !isPlaying
if isPlaying {
avPlayerLayer.goFullscreen()
avPlayerLayer.player?.play()
} else {
avPlayerLayer.player?.pause()
avPlayerLayer.minimizeToFrame(originalFrame)
}
}
}