너비가 1에서 전체보기 너비까지 3 단위로 증가하여 너비가 CALayer
이되도록 변환 애니메이션을 얻으려고합니다. 필자의 이해가 정확하다면 각 변형이 원본 레이어 크기에 적용됩니다. 너비가 1이고 변환을 스케일링하는 경우 self.view.frame.size.width
애니메이션 레이어가 전체보기 너비를 차지할 것으로 예상되지만 그 대신에 절반 정도 멈추는 것이 좋습니다. 왜 그런가요?CATransform3DMakeScale이 예상대로 레이어 너비를 변환하지 않습니다.
let progressBar1 = CALayer()
var transform1 = CATransform3DMakeScale(1, 1, 1)
var transform2 = CATransform3DMakeScale(1, 1, 1)
var transform3 = CATransform3DMakeScale(1, 1, 1)
override func viewDidLoad() {
super.viewDidLoad()
setupAnimationTransforms()
}
override func viewDidAppear(_ animated: Bool) {
buildBar()
}
func setupAnimationTransforms(){
transform1 = CATransform3DMakeScale(20, 1, 1)
transform2 = CATransform3DMakeScale(40, 1, 1)
transform3 = CATransform3DMakeScale(self.view.frame.size.width, 1, 1)
}
func buildBar(){
progressBar1.bounds = CGRect(x: 0, y: 0, width: 1, height: 5)
progressBar1.position = CGPoint(x: 0, y: self.view.frame.size.height)
progressBar1.backgroundColor = UIColor.red.cgColor
view.layer.addSublayer(progressBar1)
animate1()
}
func animate1(){
CATransaction.begin()
CATransaction.setCompletionBlock {
self.animate2()
}
let anim = CABasicAnimation(keyPath: "transform")
anim.fromValue = progressBar1.transform
anim.toValue = transform1
anim.duration = 1.00
progressBar1.add(anim, forKey: "transform")
CATransaction.setDisableActions(true)
self.progressBar1.transform = transform1
CATransaction.commit()
}
func animate2(){
CATransaction.begin()
CATransaction.setCompletionBlock {
self.animate3()
}
let anim = CABasicAnimation(keyPath: "transform")
anim.fromValue = transform1
anim.toValue = transform2
anim.duration = 1.00
progressBar1.add(anim, forKey: "transform")
CATransaction.setDisableActions(true)
progressBar1.transform = transform2
CATransaction.commit()
}
func animate3(){
CATransaction.begin()
CATransaction.setCompletionBlock {
print("DONE")
}
let anim = CABasicAnimation(keyPath: "transform")
anim.fromValue = transform2
anim.toValue = transform3
anim.duration = 1.00
progressBar1.add(anim, forKey: "transform")
CATransaction.setDisableActions(true)
progressBar1.transform = transform3
CATransaction.commit()
}
너비가 애니메이션 인 경우 현재 수행중인 완료 핸들러를 사용할 수 있습니까? – Brosef
예. CATransaction은 애니메이션 효과에 상관하지 않습니다. 또한 계층 위임을 사용하여 시작 및 중지 통지를 얻을 수 있습니다.이 경우 트랜잭션을 필요로하지 않습니다. 다른 용도로 사용하지 않는 것처럼 보이기 때문에 트랜잭션을 필요로하지 않습니다. CAAnimationDelegate 참조 –