2017-01-22 176 views
1

我有一個CAKeyframeAnimation,它在橫向上看起來不錯,但是當設備旋轉時,與其餘內容相比,當設備旋轉時,動畫當然是不合適的。有沒有辦法調整(縮放)正在進行的動畫的路徑?CoreAnimation和設備旋轉

編輯:添加代碼

 let circle = CAShapeLayer() 
     circle.path = UIBezierPath(roundedRect: CGRect(x: -60.0, y: -60.0, width: 100.0, height: 100.0), cornerRadius: 50.0).cgPath 
     circle.fillColor = UIColor.clear.cgColor 
     circle.strokeColor = UIColor.blue.cgColor 

     let animation = CAKeyframeAnimation(keyPath: "position") 
     animation.duration = (path["endTime"] as! Double) - (path["startTime"] as! Double) 
     animation.repeatCount = 0 
     animation.path = (path as! UIBezierPath).cgPath 
     animation.calculationMode = kCAAnimationPaced 
     animation.fillMode = kCAFillModeForwards 
     animation.isRemovedOnCompletion = false 

     circle.add(animation, forKey: "position") 
     self.view.layer.insertSublayer(circle, at: 5) 

的問題是,所述UIBezierPath在縱向或橫向定義(該應用支持),以便播放在相同的取向,它創建是沒有問題的,但如果旋轉設備,則應更新由UIBezierPath定義的動畫以適應新的方向。我只是在尋找一種在動畫時更新CAKeyframeAnimation路徑到新座標系的方法。

+0

你有任何代碼可以告訴我們嗎? – dfd

+0

所以你說你想改變動畫_當它在animating_的中間,因爲用戶旋轉了設備? – matt

+0

確切!因爲座標系改變路徑需要更新。我只是不知道該怎麼做。 – Chris

回答

0

我發現您無法即時調整路徑,但您可以根據原始中的點和計算的比例/平移創建新路徑。

要從UIBezierPath得到CGPoints的數組,你可以使用這個方法:一旦動畫開始https://stackoverflow.com/a/36374209/1491675

對於設備旋轉,保持參照當前點在動畫和設備旋轉重新計算路徑用新的動畫替換現有的動畫,而忽略已經發生的部分動畫。

+0

我不明白爲什麼當旋轉開始時不停止動畫,將視圖留在它所在的位置(表示層會給你這些信息),然後用新的動畫開始一個新的動畫旋轉完成後的路徑。 – matt

+0

你的意思就像我上面描述的那樣? 「...在設備上旋轉重新計算路徑並用新的動畫替換現有的動畫...」 – Chris

+0

如果顯示實際的代碼,它可能會幫助我(和其他人)。 – matt