我正在播放使用AVPlayer的视频,这是我的应用程序中大约320x200的帧。 avplayer还有一个自定义的“全屏”按钮,如youtube应用播放器。我如何实现它,以便当应用程序处于肖像模式并且用户单击全屏按钮时,视频将旋转至全屏但处于横向模式?我尝试使用转换,它部分工作,因为当它在全屏模式下,如果用户切换设备为纵向; avplayer框架突然改变。我希望它能像YouTube应用一样工作,即在全屏模式下,即使用户旋转设备,也应该保持这种状态。关闭全屏后,只能恢复原始尺寸。由于应用程序的设计,我不想使用avplayerviewcontroller。预先感谢您的帮助。AVPlayer强制全屏风景模式
回答
伟大的问题!允许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
}
}
}
设置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)
}
}
}
在我看来,你应该创建一个FullScreenViewController,它总是被迫支持风景。然后,当按下“全屏”按钮并将AVPlayer实例传递给该视图控制器时,从当前视图控制器呈现该视图控制器,然后为AVPlayerLayer设置帧并继续播放。解散后,这将恢复正常,我的意思是你的“肖像”模式。
这是我想到的以及可能的解决方案..希望看看有没有其他的方法。 –
我用FullScreenViewController试过这个解决方案,并传递了具有AVPlayerLayer以及自定义控件UIView的容器UIView。到现在为止还挺好。然而,点击关闭全屏后,我关闭了FullScreenViewController,但播放器不会在我的演示视图中播放。我如何在FullScreenViewController中实现关闭全屏?因为我认为自从它被解散后,它的观点,即玩家容器视图被取消分配。 –
部分代码:'FullScreenViewController * controller = [[FullScreenViewController alloc] init]; controller.view = self.playerContainer; //容器uiview [self presentViewController:controller animated:YES completion:nil];' –
- 1. iphone强制肖像模式从风景?
- 2. 强制“风景”方向模式
- 3. 强制Chrome(38)退出全屏模式
- 4. Android上的全屏问题与Trigger.io(&风景强制)
- 5. AVPlayer全屏
- 6. 风景模式下的相机不全屏
- 7. 斯威夫特:播放视频在风景模式下全屏
- 8. 嵌套AVPlayer全屏?
- 9. Android:在风景模式下拍摄的照片强制
- 10. Android屏幕方向:强迫风景?
- 11. CustomIOS7AlertView风景模式
- 12. 使AVPlayer全屏无信箱
- 13. 在全屏模式下的强制4:3
- 14. 强制网页以全屏模式运行
- 15. 强制用户将屏幕旋转到风景(iOS)
- 16. iOS - 强制全屏视频
- 17. 在Chrome中强制全屏
- 18. Android的webapp ::风景显示全屏
- 19. Bootstrap 3全屏旋转木马不是全屏的风景
- 20. IOS - 如何强制视图到风景
- 21. 强制MPMoviePlayerController在风景中播放
- 22. CWAC相机现在强制风景
- 23. 风景模式与模式视图
- 24. Monotouch iPhone风景模式
- 25. WeeApp的风景模式
- 26. PlayN iOS风景模式
- 27. iphone风景模式慢
- 28. Android禁用风景模式
- 29. uinavigationcontroller和风景模式
- 30. 旋转风景模式
当视频播放和全屏,设置'supportedInterfaceOrientations'仅景观 –
这工作非常久远下面给出了答案,可你也看到我的意见给它一个问题关闭全屏实现? –
澄清:您的问题是当您关闭全屏播放器时 - 较小的播放器不知道继续播放和从哪里播放? –