0
我試圖實現一個動畫來將視圖移動到我點擊的位置。 每次敲擊都會取消先前的動畫,並從當前位置開始再次移動。iOS:爲什麼動畫的關鍵很重要?
class MoveAnimationViewController: UIViewController {
lazy var block: UIView = {
let block = UIView()
block.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
block.backgroundColor = UIColor.greenColor()
return block
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(block)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "tap:"))
}
func tap(gesture: UITapGestureRecognizer) {
let fromPosition = (block.layer.presentationLayer() ?? block.layer).position
let toPostion = gesture.locationInView(view)
block.layer.removeAllAnimations()
let animation = CABasicAnimation(keyPath: "position")
animation.duration = 2
animation.fromValue = NSValue(CGPoint: fromPosition)
animation.toValue = NSValue(CGPoint: toPostion)
block.layer.addAnimation(animation, forKey: nil)
block.layer.position = toPostion
}
}
但是,塊視圖在沒有任何動畫的情況下直接跳轉到目標。
將以下代碼
block.layer.addAnimation(animation, forKey: nil)
與
block.layer.addAnimation(animation, forKey: "move")
將解決這個問題,但爲什麼呢?
順便說一句,下面的語句看上去是非法的,因爲presentationLayer
方法返回一個AnyObject?
,它沒有position
財產。對?
let fromPosition = (block.layer.presentationLayer() ?? block.layer).position
它應該替換這個,我猜。但編譯器並沒有警告我。這是一個錯誤嗎?
let fromPosition = (block.layer.presentationLayer() as? CALayer ?? block.layer).position
你爲什麼使用表示層?爲什麼不直接動畫視圖? – Sulthan
@Sulthan我想要的是將視圖移動到我點擊的位置,如果在它到達那裏之前點擊另一個地方,視圖應該停止以前的移動並從其位置開始新移動。 (我希望我已經說清楚了)。我嘗試了UIView.animateWithDuration方法,但運動看起來很奇怪,所以我必須改用層動畫。 –