CALayer - CABasicAnimation不围绕center / anchorPoint进行缩放

时间:2012-07-15 21:56:46

标签: ios core-animation

使用下面的代码我一直试图让我的CALayer围绕它的中心进行缩放 - 但是它按左/上(0,0)进行缩放。我看到了这个问题:Anchor Point in CALayer并尝试设置anchorPoint - 但在我设置它之前它是[.5,.5]并且设置没有区别。还尝试设置contentsGravity

设置是我将CAShapeLayer添加到self.view.layer我做了一些绘图,然后添加了CABasicAnimation。动画运行正常 - 但它向上/左侧缩放 - 而不是视图的中心。

几个小时一直在修补它 - 它必须是简单的东西,但我没有得到它。

shapeLayer.anchorPoint = CGPointMake(.5,.5);
shapeLayer.contentsGravity = @"center";

printf("anchorPoint %f  %f\n", shapeLayer.anchorPoint.x, shapeLayer.anchorPoint.y);

CABasicAnimation *animation =
[CABasicAnimation animationWithKeyPath:@"transform.scale"];

animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
animation.toValue =   [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];

[animation setDuration:1.0];
animation.fillMode=kCAFillModeForwards;
animation.removedOnCompletion=NO;
[shapeLayer addAnimation:animation forKey:@"zoom"];

4 个答案:

答案 0 :(得分:47)

您图层的bounds是什么?

我敢打赌它的尺寸为零;尝试将其大小设置为与形状相同的大小。

CAShapeLayer将形状绘制为一种叠加层,与您在普通版中使用的contents(以及boundscontentsGravity等)无关CALayer。这可能有点令人困惑。

答案 1 :(得分:3)

还要确保在创建视图后添加动画如果您尝试在viewDidLoad中添加动画,则可能无效。请尝试将其添加到viewDidAppear中。

我只知道斯威夫特,但这是一个例子:

override func viewDidAppear (animated: Bool) {
    addPulsation(yourButton)
}

func addPulsation (button: UIButton) {
    let scaleAnimation:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale")
    scaleAnimation.duration = 1.0
    scaleAnimation.repeatCount = 100
    scaleAnimation.autoreverses = true
    scaleAnimation.fromValue = 1.05;
    scaleAnimation.toValue = 0.95;
    button.layer.addAnimation(scaleAnimation, forKey: "scale")
}

答案 2 :(得分:1)

这是一个老线程,但万一这会帮助任何人。

这是一个坐标空间问题。您只需要设置绘图空间和路径的空间。这段代码对我有用......

...只是把它放在动画创建方法的开头(在父视图的方法内)......

curl https://<target-host>/v2/info

此代码在iOS和MacOS上保持不变 - 除了MacOS图层上的可选选项。

(顺便说一句,你需要在动画结束后删除动画层!)

答案 3 :(得分:-1)

我花了几个小时来找出如何根据中心做到这一点,但找不到OSX的任何解决方案。我决定使用CATransform3DMakeTranslation移动图层并组合两种变换。

我的代码:

NSView *viewToTransform = self.view;
[viewToTransform setWantsLayer:YES];

viewToTransform.layer.sublayerTransform = CATransform3DConcat(CATransform3DMakeScale(-1.0f, -1.0f, 1.0f), CATransform3DMakeTranslation(viewToTransform.bounds.size.width, viewToTransform.bounds.size.height, 0));
相关问题