2012-12-31 16 views
1

我采取了以下解决方案暂停的UIView动画冻结用户交互:使用的CALayer UIView的动画暂停恢复后的方向变化

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

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

后我暂停了我的动画,然后继续旋转我的设备,屏幕上的其他视图开始调整大小,但由于某种原因,这会冻结屏幕上的所有交互和视图 - 方向更改不再有效,按钮无响应。但是,如果在动画运动时旋转设备,则一切正常,因为它应该是正常的。

我做的另一个测试是取出外部视图的自动调整大小,使得视图变成动画,这可以让事情正常工作。

看起来暂停的图层和父图层的自动调整大小之间存在一些冲突。我无法弄清楚如何避开它。

任何帮助将不胜感激。

回答

1

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

2

正如您发现的那样,视图的图层已暂停这一事实意味着,当您旋转设备时,它无法以新的大小动画,并且会冻结UI。

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

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

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

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