2012-12-31 50 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 
     } 
    } 
}