2015-09-26 25 views
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 
+0

你爲什麼使用表示層?爲什麼不直接動畫視圖? – Sulthan

+0

@Sulthan我想要的是將視圖移動到我點擊的位置,如果在它到達那裏之前點擊另一個地方,視圖應該停止以前的移動並從其位置開始新移動。 (我希望我已經說清楚了)。我嘗試了UIView.animateWithDuration方法,但運動看起來很奇怪,所以我必須改用層動畫。 –

回答

2

如果你命名的動畫,也就是它的主要關聯,那麼它會替代任何其他動畫使用相同的密鑰。如果您沒有提供自動取消和替換的名稱,則不會發生。

+0

我認爲block.layer.removeAllAnimations()會取消所有的動畫,不是嗎? –

相關問題