2

複数の変換を UIView に適用することについて質問があります。たとえば、中心点を中心に UIView の回転をアニメーション化し、その後、境界の外側にある点を中心に回転しようとすると、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が、これもアニメーションを台無しにするだけです

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

4

1 に答える 1

2

2つのこと:

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

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

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

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 0, 1, 0);
    
  2. 2 番目のステップで、変換を現在の変換に追加する (つまり、さらに 180° 回転する) だけの場合は、この行を変更する必要があります。

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

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

    これにより、現在の変換が無視されるのではなく、既存の変換に変換が適用されます。

于 2012-01-21T17:25:21.277 に答える