使用下面的代码我一直试图让我的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"];
答案 0 :(得分:47)
您图层的bounds
是什么?
我敢打赌它的尺寸为零;尝试将其大小设置为与形状相同的大小。
CAShapeLayer
将形状绘制为一种叠加层,与您在普通版中使用的contents
(以及bounds
和contentsGravity
等)无关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));