CALayer的 - CABasicAnimation不是围绕中心/ anchorPoint缩放(

2019-06-26 07:55发布

使用下面的代码,我一直在试图让我的CALayer的缩放围绕其中心 - 但它通过扩展左/顶(0,0)。 我看到了这样一个问题: 锚定点的CALayer ,并尝试设置anchorPoint -但它是[3.5,0.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"];

Answer 1:

什么是bounds的层?

我敢打赌,它具有零大小; 尝试它的大小设置为相同大小的形状。

CAShapeLayer绘制形状,种类覆盖的,独立的contents (以及boundscontentsGravity等),您会在普通使用CALayer 。 它可以是一个有点混乱。



Answer 2:

另外,还要确保您要添加动画在创建视图之后。 如果你想在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")
}


Answer 3:

这是一个古老的线程,但在此情况下,任何人帮助。

此保险业监督的坐标空间的问题。 你只需要设置绘图空间和路径的空间。 此代码的工作对我来说...

......只是把这个在动漫创作方法的开始(在方法中父视图)...

// add animation to remap (without affecting other elements)
    let animationLayer = CALayer()
    layer?.addSublayer(animationLayer). // (don't use optional for iOS)

// set the layer origin to the center of the view (or any center point for the animation)
    animationLayer.bounds.origin .x = -self.bounds.size.width / 2.0
    animationLayer.bounds.origin .y = -self.bounds.height / 2.0

// make image layer with circle around the zero point
    let imageLayer = CAShapeLayer()
    animationLayer.addSublayer(imageLayer)

    let shapeBounds = CGRect(x: -bounds.size.width/2.0,
                             y:-bounds.size.height/2.0,
                             width: bounds.size.width,
                             height: bounds.size.height)

    imageLayer.path = CGPath(ellipseIn: shapeBounds, transform: nil)
    imageLayer.fillColor = fillColour


    // **** apply your animations to imageLayer here ****

此代码适用于iOS和MacOS不变 - 除了可选的需要上层为MacOS。

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



Answer 4:

我花了几个小时,以找出如何做到这一点根据的中心,但找不到任何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));


文章来源: CALayer - CABasicAnimation not scaling around center/anchorPoint