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

时间:2015-02-23 01:39:38

标签: ios cocoa-touch avfoundation

我在动画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动画。

1 个答案:

答案 0 :(得分:1)

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

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