动画视频 UIView 像 YouTube 应用程序一样全屏显示

Wal*_*ker 4 animation uiview swift

我有一个视图控制器,其中有一个UIView我称之为playerView. 在 中playerView,我使用AVLayerAVPlayerLayer向用户展示视频。当您第一次点击任何视频时,对 Youtube 应用程序进行成像。

我如何操纵它的框架playerView,以便它可以占据整个屏幕。(全屏显示)

这是当前帧:

 //16 x 9 is the aspect ratio of all HD videos
 let height = view.frame.width * 9 / 16
 let playerFrame = CGRect(x: 0, y: 0, width: view.frame.width, height: height)    
 playerView.frame = videoPlayerFrame
Run Code Online (Sandbox Code Playgroud)

我在 YouTube 应用程序中进行了测试,由于全屏视频动画的外观,他们的应用程序仅支持纵向(就像我的一样)。如何通过点击按钮甚至在用户水平握住设备时执行此操作?

UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

   self.playerView.frame = ?

}, completion: nil)
Run Code Online (Sandbox Code Playgroud)

编辑:尝试过这个,但它并没有真正按照我想要的方式工作......它不会占据整个屏幕

UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

   self.playerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.height, height: self.view.frame.width)
   self.playerView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))

}, completion: nil)
Run Code Online (Sandbox Code Playgroud)

Wal*_*ker 6

我想到了。

我创建了一个名为 的全局变量isExpanded,当我们处于全屏模式时,它将设置为 true。另外,我创建了一个名为 CGPoint 的变量videoPlayerViewCenter,以便我可以在全屏显示之前保存中心,以便在返回小屏幕时可以再次设置它。

这是当用户想要全屏时调用的代码

func fullScreenTapped(sender: vVideoPlayer) {

        if !isExpanded {
            //Expand the video
            UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

                self.videoPlayerViewCenter = self.videoPlayerView.center

                self.videoPlayerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.height, height: self.view.frame.width)
                self.videoPlayerView.center = self.view.center
                self.videoPlayerView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
                self.videoPlayerView.layoutSubviews()

            }, completion: nil)
        } else {
            //Shrink the video again

            UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

                //16 x 9 is the aspect ratio of all HD videos

                self.videoPlayerView.transform = CGAffineTransform.identity
                self.videoPlayerView.center = self.videoPlayerViewCenter

                let height = self.view.frame.width * 9 / 16
                let videoPlayerFrame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: height)
                self.videoPlayerView.frame = videoPlayerFrame

                self.videoPlayerView.layoutSubviews()

            }, completion: nil)
        }

        isExpanded = !isExpanded
    }
Run Code Online (Sandbox Code Playgroud)

为了扩展视频,我将中心保存在全局 CGPoint 变量中,然后设置框架。然后,我设置中心并使用 进行 90 度转弯CGAffineTransform

为了再次缩小视频,我基本上将设置设置为之前的样子。(事情完成的顺序非常重要)

另一件也非常重要的事情是重写layoutSubviewsvideoPlayerView 中的方法,如下所示:

override func layoutSubviews() {
        super.layoutSubviews()
        self.playerLayer?.frame = self.bounds
    }
Run Code Online (Sandbox Code Playgroud)

这将使您playerLayer随着视图变大而调整其框架。