2

CABasicAnimationiOSアプリを作成していますが、半透明のマテリアルエフェクトのように、回転する(by)画像を下のサーフェスに反映する方法が必要です。indicator名前を付けindicatorReflectionて初期化する画像のコードは次のとおりです。

#define rotation_reflected(ANG) CGAffineTransformMakeRotation(M_PI/2 - (ANG * M_PI / 180.0))
#define rotation(ANG) CGAffineTransformMakeRotation(-M_PI/2 - (ANG * M_PI / 180.0))
[self rotateIndicator:0];

-(void)rotateIndicator:(float)degrees{
    self.indicatorView.transform = rotation(degrees);
    self.indicatorReflectionView.transform = rotation_reflected(degrees);
}

その後、次のコードを使用してアニメーション化します。

-(void)startWanderingIndicator{
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    CATransform3D xform = CATransform3DMakeAffineTransform(rotation(180));
    anim.toValue = [NSValue valueWithCATransform3D:xform];
    anim.duration = 4.0f;
    anim.fillMode = kCAFillModeForwards;
    anim.removedOnCompletion = NO;
    [self.indicatorView.layer addAnimation:anim forKey:@"rotation"];


    anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    xform = CATransform3DMakeAffineTransform(rotation_reflected(180));
    anim.toValue = [NSValue valueWithCATransform3D:xform];
    anim.duration = 4.0f;
    anim.fillMode = kCAFillModeForwards;
    anim.removedOnCompletion = NO;
    [self.indicatorReflectionView.layer addAnimation:anim forKey:@"rotation"];

}

最初のものは問題ありません。問題は、反射されたビューから始まります。ほぼすべての+/-PI/2と+/-ANGLEの組み合わせを試しましたが、反射ビューを正しい反射経路に従わせることはできません。私は三角法の人ではありませんが、これは数学を知っている人にとっては非常に些細なことであるはずです。それに加えて、可能なすべての組み合わせを試しました。いずれにせよ、そのうちの1つが正解です。回転計算コードに問題がありますか、それともアニメーション/変換メソッドに関係がありますか?

ありがとう、

できる。

4

1 に答える 1

1

関数はおそらく次のようになります。

#define rotation_reflected(ANG) CGAffineTransformMakeRotation(M_PI/2 + (ANG * M_PI / 180.0))
#define rotation(ANG) CGAffineTransformMakeRotation(-M_PI/2 - (ANG * M_PI / 180.0))

最初の行の + 記号に注意してください。2 つのオブジェクトを反対方向に回転させたい場合。ただし、ビューの 1 つを反転しない限り、適切な外観にはなりません (ミラーリングは回転だけではシミュレートできません)。たとえば、y軸で-1のスケール変換を持つサブビューを作成してみてください。

ただし、変換が回転しようとしている方向を知る方法がないため、これはあなたが望むことをしないかもしれません. 、しかし、CABasicAnimation は時計回りか反時計回りかを認識しません。変換には「符号」がないため、-180 度から 180 度を見分けることはできません。)

目的の効果を得る方法は、 を使用することCAValueFunctionです。変換元と変換先を指定するのではなく、実行したいこと (Z 軸を中心に回転) と、回転元と回転先の角度を指定します (この場合、符号が考慮されます)。CAValueFunction ドキュメントを引用するには:

kCAValueFunctionRotateZ を指定する CAValueTransform 関数を作成し、次に fromValue を 0、toValue を M_PI に設定してアニメーションを作成し、アニメーションの valueTransform プロパティを値変換インスタンス。

したがって、次のようなものが必要です。

-(void)startWanderingIndicator{
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    anim.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];
    anim.toValue = rotation(180);
    anim.duration = 4.0f;
    anim.fillMode = kCAFillModeForwards;
    anim.removedOnCompletion = NO;
    [self.indicatorView.layer addAnimation:anim forKey:@"rotation"];


    anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    anim.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];
    anim.toValue = rotation_reflected(180);
    anim.duration = 4.0f;
    anim.fillMode = kCAFillModeForwards;
    anim.removedOnCompletion = NO;
    [self.indicatorReflectionView.layer addAnimation:anim forKey:@"rotation"];
}
于 2013-01-15T01:56:41.630 に答える