1

これはトリッキーです!

ビューAとビューAのサブビューであるビューBがあります。両方のビューのフレームは一定です。

変換行列を変更してビュー A を回転させます。

viewA.transform = CGAffineTransformMakeRotation(angle);

ここで、ビュー B の変換マトリックスを調整して、視覚的な位置と回転が同じままになるようにします。つまり、A の回転角度を変更しながら B を移動/回転させてはなりません。

明らかに、ビュー B を反対方向に回転させる必要がありますが、それだけでは十分ではありません。

私はこれを試しましたが、Bはまだぐらつきます:

viewB.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-angle), viewA.bounds.size.width, viewA.bounds.size.height);

たぶん、正しい行列はviewBのフレームにも依存します...サインとコサインを使用する必要があるかもしれません...?

単純に B を A の兄弟ビューにすることもできますが、そうしたくありません。

4

2 に答える 2

0

こんにちは、これを試して教えてください pls

viewB.transform=CGAffineTransformInvert(viewA.transform)
于 2012-05-08T15:11:04.320 に答える
0

頭に浮かんだ2つのこと。

まず、ビュー A からビュー B を削除し、それをビュー A のスーパービューにアタッチしてみませんか (回転シーケンスのためであっても)。視覚的に同一になります。

もう 1 つの考えは、アニメーションを CATransaction にラップして、アニメーションの同期を保つことです。

ビュー B をビュー A に保持せず、アニメーションを 1 つではなく 2 つ実行することをお勧めします。クリッピングが境界に基づいているため、ビュー B をビュー A 内に保持している理由はありますか?

これはレイヤーの場合ですが、ビューでも同じように機能します。

[CATransaction begin];
[CATransaction flush];
[CATransaction setAnimationDuration:2.0f];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
CATransform3D transform = CATransform3DMakeRotation(M_PI/4, 0, 0, 1);
outerLayer.transform = CATransform3DConcat(outerLayer.transform, transform);
innerLayer.transform = CATransform3DInvert(outerLayer.transform);
[CATransaction commit];
于 2012-05-08T15:14:58.670 に答える