iphone - シーケンシャルUIView変換

iphone objective-c animation uiview catransform3d

UIViewに複数の変換を適用することについて質問があります。たとえば、UIViewの回転をその中心点を中心にアニメーション化し、その後、境界の外側にある点を中心に回転させようとすると、2番目のアニメーションがすべて乱れます。ジッターしたり、指定した方法とはまったく異なる方法で回転したりします。最初のアニメーションが2番目のアニメーションに影響を与えず、2番目のアニメーションが再生されても存在するようにするにはどうすればよいですか?

編集:これがコードです。まず、中心点を中心にビューを回転させます。

CALayer *layer = view.layer;

CATransform3D aTransform = CATransform3DIdentity;
CGFloat zDistance = 2000;
aTransform.m34 = 1.0 / -zDistance;  
scrollView.layer.sublayerTransform = aTransform;

CGFloat subviewX = 0.5;
CGFloat subviewY = 0.5;
[self setAnchorPoint:CGPointMake(subviewX, subviewY) forView:view];

CATransform3D bTransform = CATransform3DIdentity;  
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"];  
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform];
bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0);
rotateAnim.duration=0.05;
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform];
layer.transform = bTransform;
[layer addAnimation:rotateAnim forKey:nil];


レイヤーが回転したので、画面の左側の境界線を中心に反転させます。

CALayer *layer = view.layer;

CATransform3D aTransform = CATransform3DIdentity;
CGFloat zDistance = 2000;
aTransform.m34 = 1.0 / -zDistance;  
tileScrollView.layer.sublayerTransform = aTransform;

CGFloat subviewX = ((1/view.frame.size.width)*(view.frame.origin.x));
CGFloat subviewY = 0.5;
[self setAnchorPoint:CGPointMake(-subviewX, subviewY) forView:view];

CATransform3D bTransform = layer.transform;
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform];
bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0);
rotateAnim.duration=0.2;
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform];
layer.transform = bTransform;
[layer addAnimation:rotateAnim forKey:nil];


回転したレイヤーを反転させたいので、2番目のアニメーションの最初にCATransform3D bTransform = layer.transformではなくCATransform3D bTransform = CATransform3DIdentityを配置しますが、これもアニメーションを混乱させるだけです。

私が抱えているもう1つの同様の問題は、9つのサブビューを含むUIViewがあり、そのうちの1つがその中心点を毎秒反転することです。しかし、これらの9つのUIViewのsuperViewに変換を適用するたびに、subViewのレイアウトがめちゃくちゃになります。これを防ぐ方法を知っている人はいますか?どんな助けでも大歓迎です。前もって感謝します!
答え
2つのこと:


最初の変換では、次のようにします。

bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0);


つまり、x軸とy軸の間で45°の軸を中心に回転します。それはあなたがやろうとしていることかもしれませんが、奇妙に思えます。に変更することを検討してください

bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 0, 1, 0);

2番目のステップで、現在の変換に変換を追加するだけ(つまり、さらに180度回転する)場合は、この線を変更する必要があります。

bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0);




bTransform = CATransform3DRotate(bTransform, -M_PI_2, 0, 1, 0);


これにより、現在の変換を無視する代わりに、既存の変換に変換が適用されます。
関連記事

iphone - UITextFieldsにテキストが追加されたときに、UIReturnKeyGoとUIReturnKeyNextを切り替えるにはどうすればよいですか?

c# - UITableViewでランダムに「NIBをバンドルでロードできませんでした」

iphone - PrintScreenを使用したり、画面の一部に画像を保存したりできますか?

iphone - プロパティtxtname(uiTextView *)のタイプがivar txtname(uiTextView)と一致しません

iphone - ビューとWebサービスの同期呼び出しの読み込みに関する問題

iphone - AppStoreでのホームオートメーションアプリのアップロード

iphone - 特定のiOSバージョンでサポートされていないライブラリをバイパスする方法は?

iphone - プログラムでスイッチをscrollviewに追加すると例外がスローされる

iphone - MPMoviePlayerエラーコードのリストはありますか

iphone - iPhoneのキーボードボタンを複製しようとしています