Kin*_*vid 2 iphone video ios avplayer avplayerlayer
我正在使用AVPlayer播放视频,该视频在我的应用中约为320x200帧。avplayer还具有一个自定义的“全屏”按钮作为叠加层添加,例如youtube应用程序播放器。如何实现该功能,以便当应用程序处于纵向模式且用户单击全屏按钮时,视频将旋转至全屏但处于横向模式?我尝试使用transform,但它部分起作用,因为当处于全屏模式时,如果用户将设备切换为纵向模式;avplayer框架突然改变。我希望它能像youtube应用一样工作,即在全屏模式下,即使用户旋转设备,它也应保持不变。全屏关闭时,仅应恢复原始大小。由于应用程序的设计,我不想使用avplayerviewcontroller。在此先感谢您的帮助。
好问题!允许AVPLayerLayer全屏显示非常重要。单个视图需要大量的应用程序配置,以同时处理纵向和横向图像,仅显示全屏视频?请。
变换和帧操作可以解决此问题:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
设置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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5543 次 |
| 最近记录: |