CATransform3DMakeScale不按预期方式变换图层宽度

问题描述:

我试图通过让宽度为1的宽度为1的整体视图的宽度增加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() 

} 

这里没有必要使用转换;你可以简单地动画宽度。

此外还有一个不变的CATransform3DIdentity,因此您不需要CATransform3DMakeScale(1,1,1)。

至于你原来的问题,我相信答案是你缩放的默认定位点是0.5,2.5,所以你的放大的酒吧的几乎一半离屏幕左侧(或更准确地说是一半减0.5点在屏幕左侧)。您还需要在此处进行翻译,或者如果您确实需要使用比例尺,则需要移动定位点。动画宽度是一个更容易的解决方案,因为不需要混淆锚点或连接变换。

+0

如果我动画只是宽度,我仍然可以使用像我目前正在做的完成处理程序? – Brosef

+0

是的。 CATransaction不关心你在做什么动画。您也可以使用图层委托获取启动和停止通知,在这种情况下,您不需要该事务,因为它看起来并不像您用于其他任何事情。请参阅CAAnimationDelegate –