使用CALayer的UIView动画暂停恢复会在方向更改时冻结用户交互

时间:2012-12-31 14:19:57

标签: uiview uiinterfaceorientation uiviewanimation

我正在实现以下解决方案来暂停UIView动画:

https://stackoverflow.com/a/3003922/1014164

暂停和恢复动画正在运行,但是:

在我暂停动画并继续旋转设备后,屏幕上的其他视图开始调整大小,但由于某种原因,这会冻结屏幕上的所有交互和视图 - 方向更改不再有效,按钮是无响应。

但是,如果我在动画运动时旋转设备,一切正常。

我做的另一项测试是取出外部视图的自动调整大小,其中包含动画视图,这样可以使事情正常工作。

暂停图层和父图层的自动调整大小之间似乎存在一些冲突。我只是无法弄清楚如何绕过它。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

正如您所发现的那样,视图图层暂停的事实意味着当您旋转设备时它无法动画为新尺寸,这会冻结用户界面。

然而,有一个更清洁的解决方案,不会放弃iOS的漂亮的调整大小动画或自动布局。您可以在根层下创建一个中间层,并将所有其他层放在其下。然后,您应该使用此中间层来控制动画的速度(或暂停它们)。

由于iOS在设备旋转时不会调整子图层的大小,因此暂停图层并不重要。

(我意识到这个答案很晚,但它仍然可以为某人服务)。

答案 1 :(得分:1)

由于方向更改会导致正在使用其他视图的动画,因此我必须禁用这些视图的自动调整大小,从而避免在暂停动画时发生冲突。 那些正在自动调整的视图在方向通知方法中手动调整大小。

答案 2 :(得分:0)

在@ tarmes的后续版中,您还可以尝试以下内容:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    if let myView = self.view
    {
        let currentLayerSpeed = myView.layer.speed

        coordinator.animateAlongsideTransition(
        {
            (context) -> Void in

            // Animating alongside… nothing to animate.
            if currentLayerSpeed == 0
            {
                myView.layer.speed = 1.0
            }
        })
        {
            // Completion
            (context) -> Void in

            // Rotation animation completed – resetting the layer speed
            myView.layer.speed = currentLayerSpeed
        }
    }
}