Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UIView动画暂停恢复使用CALayer在方向更改时冻结用户交互_Uiview_Uiinterfaceorientation_Uiviewanimation - Fatal编程技术网

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

UIView动画暂停恢复使用CALayer在方向更改时冻结用户交互,uiview,uiinterfaceorientation,uiviewanimation,Uiview,Uiinterfaceorientation,Uiviewanimation,我正在实施以下解决方案来暂停UIView动画: 暂停和恢复动画正在工作,但是: 暂停动画并继续旋转设备后,屏幕上的其他视图开始调整大小,但由于某些原因,这会冻结屏幕上的所有交互和视图-方向更改不再有效,按钮没有响应 但是,如果在动画运动时旋转设备,则一切正常 我做的另一个测试是自动调整外部视图的大小,该视图包含正在设置动画的视图,这样可以正常工作 暂停的图层和父图层的自动调整大小之间似乎存在一些冲突。我就是想不出怎么避开它 如果有任何帮助,我将不胜感激。由于方向更改会导致使用其他视图上的动画,

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

暂停和恢复动画正在工作,但是:

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

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

我做的另一个测试是自动调整外部视图的大小,该视图包含正在设置动画的视图,这样可以正常工作

暂停的图层和父图层的自动调整大小之间似乎存在一些冲突。我就是想不出怎么避开它


如果有任何帮助,我将不胜感激。

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

正如您所发现的,视图的图层已暂停这一事实意味着在旋转设备时无法将其设置为新的大小,这将冻结UI

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

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


(我意识到这个答案已经很晚了,但它可能仍然对某些人有用)。

在@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
        }
    }
}