AVPlayer 中的视频不会以与播放器本身相同的速率改变大小

Video in AVPlayer not changing size at same rate as player itself

我在为 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 动画的方法。

当我同时为 containerView 的 superview 的大小和位置设置动画时,我可以重现它。如果 containerView 是普通视图而不是 AVPlayer 视图,则一切正常。

我的建议是使用 animateWithDuration:animations: 而不是 usingSpringWithDamping。我认为它后面使用了一个 CASpringAnimation ,导致其中一个子层的高度始终从原始值动画到具有不同持续时间的新值。您还可以首先使用普通动画对其大小进行动画处理,然后使用 spring 动画对其位置进行动画处理。