27

以下のコードを使用して、CALayerをその中心を中心にスケーリングしようとしていますが、左/上(0,0)でスケーリングします。私はこの質問を見ました: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

4 に答える 4

56

boundsあなたのレイヤーは何ですか?

サイズはゼロだと思います。サイズを自分の形と同じサイズに設定してみてください。

CAShapeLayer通常ので使用するcontents(and boundsand andなど)とは関係なく、一種のオーバーレイとして形状を描画します。少し混乱する可能性があります。contentsGravityCALayer

于 2012-07-15T22:03:25.640 に答える
5

また、ビューの作成後にアニメーションを追加していることを確認してください。viewDidLoadにアニメーションを追加しようとしている場合は、おそらく機能しません。代わりにviewDidAppearに追加してみてください。

私はSwiftしか知りませんが、ここに例があります:

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")
}
于 2016-07-27T18:01:42.323 に答える
1

それは古いスレッドですが、これが誰かを助ける場合に備えて。

これは、座標空間の問題です。描画スペースとパスのスペースを設定するだけです。このコードは私のために働きます...

...これをアニメーション作成メソッドの先頭(親ビューのメソッド内)に配置するだけです...

// 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のレイヤーで必要なオプションは別です。

(ところで、アニメーションの終了後にアニメーションレイヤーを削除する必要があります!)

于 2018-04-15T13:19:21.490 に答える
-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));
于 2016-08-16T15:50:45.097 に答える