我在动画AVPlayer
时遇到了一个奇怪的问题。我正在使用布局约束更改UIView
的大小,并使用动画块中的layoutIfNeeded()
设置更改动画。动画UIView
中的每个子视图都会正常动画,包括AVPlayer
本身,但播放器内的视频不会使用相同的动画曲线制作动画。
AVPlayer
通过AVPlayerController
嵌入到容器视图中。容器是动画视图的子视图。
动画视频非常清楚地显示了问题:http://goo.gl/DGq8rO
我知道AVPlayer
正在改变正确的动画曲线上的大小,因为您可以看到播放器控制栏的顶部以正确的速率制作动画,因此这必须是视频本身的一些问题。我不太了解AVKit
/ AVFoundation
的玩家方面,所以任何指导都会受到赞赏。
这是从中调用动画的函数:
func updateSize(duration: NSTimeInterval, _ dampening: CGFloat) {
heightConstraint.constant = actualHeight
if duration > 0 {
UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: dampening, initialSpringVelocity: 0, options: nil, animations: {
self.superview!.layoutIfNeeded()
}, completion: nil)
} else {
self.superview?.layoutIfNeeded()
}
}
我已使用基本的animateWithDuration
函数(没有usingSpringWithDampening
的函数)对其进行了测试,并且它可以正常运行。不过,这更像是一种解决方法,而不是修复方法。我现在正在寻找一些方法来使用usingSpringWithDempening
动画。
答案 0 :(得分:1)
当我同时为containerView的superview的大小和位置设置动画时,我可以重现它。如果containerView是普通视图而不是AVPlayer视图,那么一切正常。
我的建议是使用animateWithDuration:animations:
而不是usingSpringWithDamping
。我认为它背后有一个CASpringAnimation
,导致其中一个子层的高度总是从原始值动画到具有不同持续时间的新值。您还可以首先使用普通动画设置其大小,然后使用弹簧动画设置其位置。