6

次の関数を使用して、ビューにパルス効果を適用しています

- (void)pulse {

    CATransform3D trasform = CATransform3DScale(self.layer.transform, 1.15, 1.15, 1);
    trasform = CATransform3DRotate(trasform, angle, 0, 0, 0);

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    animation.toValue = [NSValue valueWithCATransform3D:trasform];
    animation.autoreverses = YES;
    animation.duration = 0.3;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animation.repeatCount = 2;
    [self.layer addAnimation:animation forKey:@"pulseAnimation"];

}

CATransform3D self.layer.transform の代わりに CGAffineTransform self.transform を使用して同じ結果を得たいと思います。これは可能ですか?

4

3 に答える 3

10

を に変換することCATransform3Dは可能CGAffineTransformですが、一部の機能が失われます。CGAffineTransformCore Graphics でレンダリングできるように、レイヤーとその祖先の集約変換を に変換すると便利であることがわかりました。制約は次のとおりです。

  • 入力は XY 平面でフラットとして扱われます
  • 出力は XY 平面でもフラットとして扱われます
  • からの視点/短縮は.m34中和されます

それが目的に合っていると思われる場合:

    // m13, m23, m33, m43 are not important since the destination is a flat XY plane.
    // m31, m32 are not important since they would multiply with z = 0.
    // m34 is zeroed here, so that neutralizes foreshortening. We can't avoid that.
    // m44 is implicitly 1 as CGAffineTransform's m33.
    CATransform3D fullTransform = <your 3D transform>
    CGAffineTransform affine = CGAffineTransformMake(fullTransform.m11, fullTransform.m12, fullTransform.m21, fullTransform.m22, fullTransform.m41, fullTransform.m42);

スーパーレイヤーから連結するなどして、最初に 3D 変換ですべての作業を行い、最後に集約CATransform3Dをに変換する必要がありCGAffineTransformます。レイヤーが最初から平らで、平らなターゲットにレンダリングすることを考えると、3D 回転が 2D シアーになったので、これが非常に適していることがわかりました。また、縮み率を犠牲にしても問題ないと思いました。アフィン変換は平行線を維持する必要があるため、これを回避する方法はありません。

たとえば、Core Graphics を使用して 3D 変換されたレイヤーをレンダリングするには、変換を連結し (アンカー ポイントを考慮して!)、次にアフィンに変換し、最後に:

    CGContextSaveGState(context);
    CGContextConcatCTM(context, affine);
    [layer renderInContext:context];
    CGContextRestoreGState(context);
于 2013-08-26T15:32:08.270 に答える
3

もちろん。Xcode ドキュメントで CGAffineTransform を検索すると、「CGAffineTransform リファレンス」というタイトルの章が見つかります。その章には、「関数」というセクションがあります。これには、CATransform3DScale (CGAffineTransformScale) および CATransform3DRotate (CGAffineTransformRotate) と同等の関数が含まれています。

CATransform3DRotate への呼び出しは実際には意味がないことに注意してください。軸を中心に回転する必要があり、3 つの軸すべてに 0 を渡しています。通常、CATransform3DRotate(trasform, angle, 0, 0, 1.0 ) を使用して、Z 軸を中心に回転します。ドキュメントを引用するには:

ベクトルの長さがゼロの場合、動作は未定義です。

于 2012-05-08T17:24:52.307 に答える