Wal*_*ker 4 animation uiview swift
我有一个视图控制器,其中有一个UIView我称之为playerView. 在 中playerView,我使用AVLayer和AVPlayerLayer向用户展示视频。当您第一次点击任何视频时,对 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)
我想到了。
我创建了一个名为 的全局变量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随着视图变大而调整其框架。