我試圖實現兩個連續的轉換動畫。當第一個動畫結束時,通過完成處理程序調用第二個動畫。因爲這是一個轉換動畫,所以我的問題是,當第一個動畫完成時,圖層將調整回原始大小,然後開始第二個動畫。我希望第二個動畫以第一個轉換動畫之後的新圖層大小開始。這篇文章Objective-C - CABasicAnimation applying changes after animation?說我必須在開始第一個動畫之前調整/轉換圖層,以便第一個動畫結束時,圖層實際上是新的大小。我試圖通過改變邊界或者實際上將變換應用到圖層來實現,但它仍然不起作用。CALayer在轉換動畫後調回原始大小
override func viewDidAppear(_ animated: Bool) {
buildBar()
}
func buildBar(){
progressBar1.bounds = CGRect(x: 0, y: 0, width: 20, height: 5)
progressBar1.position = CGPoint(x: 0, y: 600)
progressBar1.backgroundColor = UIColor.white.cgColor
view.layer.addSublayer(progressBar1)
extendBar1()
}
func extendBar1(){
CATransaction.begin()
let transform1 = CATransform3DMakeScale(10, 1, 1)
let anim = CABasicAnimation(keyPath: "transform")
// self.progressBar1.bounds = CGRect(x: 0, y: 0, width: 200, height: 5)
// self.progressBar1.transform = transform1
anim.isRemovedOnCompletion = false
anim.fillMode = kCAFillModeForwards
anim.toValue = NSValue(caTransform3D:transform1)
anim.duration = 5.00
CATransaction.setCompletionBlock {
self.extendBar2()
}
progressBar1.add(anim, forKey: "transform")
CATransaction.commit()
}
func extendBar2(){
let transform1 = CATransform3DMakeScale(2, 1, 1)
let anim = CABasicAnimation(keyPath: "transform")
anim.isRemovedOnCompletion = false
anim.fillMode = kCAFillModeForwards
anim.toValue = NSValue(caTransform3D:transform1)
anim.duration = 5.00
progressBar1.add(anim, forKey: "transform")
}
是否有可能使用這個完成處理程序?我試圖在兩個動畫之間做些什麼,這就是爲什麼我有完成處理程序。 – Brosef
哼,不,當達到關鍵幀動畫的某些點時,你沒有回調。讓我花一分鐘用兩種不同的動畫擴展我的答案,以便您可以使用完成處理程序。 – tomahh
@Brosef一分鐘變成12,但答案已更新:) – tomahh