0

画像をクリックするとズームインおよびズームアウトする画像グリッドがあります。すべて正常に動作していますが、CGAffineTransform の回転を制御するのに問題があります。角度を渡して回転を決定する方法を制御できると思っていましたが、そうすると、変換がズームインせず、ズームアウトしたままになります。
ルーチンの作成中にどこかでこれの適切な実装を逃したと感じているので、どこが間違っていたかを誰かが指摘できれば幸いです。これが私のコードです

     float angle =  -1.661799;

     if(status == 0){
             [UIView animateWithDuration:1.5f delay:0.0f
               options:UIViewAnimationOptionCurveEaseIn animations:^{
                  CGAffineTransform totalTransform =
                  CGAffineTransformMakeTranslation(-middleX  , -middleY );
                  totalTransform = CGAffineTransformScale(totalTransform, 3.5f, 3.5f);
                  totalTransform = CGAffineTransformTranslate(totalTransform, middleX , middleY );
                  //totalTransform = CGAffineTransformMakeRotation(angle);
                 [self.view setTransform:totalTransform];
             }completion:^(BOOL finished) {
             }];
            status++;
     }else{
            [UIView animateWithDuration:1.3f delay:0.0f 
               options:UIViewAnimationOptionCurveEaseIn animations:^{

                  CGAffineTransform tr = CGAffineTransformMakeScale(1.00 ,1.00);
                  [self.view setTransform:tr];
                }completion:^(BOOL finished) {

                  [UIView animateWithDuration:1.3f delay:0.0f 
                  options:UIViewAnimationOptionCurveEaseIn animations:^{
                        CGAffineTransform totalTransform =
                        CGAffineTransformMakeTranslation(-middleX  , -middleY );
                        totalTransform = CGAffineTransformScale(totalTransform, 3.5f, 3.5f);
                        totalTransform = CGAffineTransformTranslate(totalTransform, middleX , middleY );
                        //totalTransform = CGAffineTransformMakeRotation(angle);
                        [self.view setTransform:totalTransform];
                   }completion:^(BOOL finished) {}];

               }];
               status = 0;
      }
4

1 に答える 1

1

これは古い質問ですが、誰かがそれに戻ってきた場合に備えて:

一連の変換を行う場合、正しい呼び出しを使用する必要があります。変換の各タイプ (回転、平行移動、スケーリング) には 2 つの呼び出しがあります。1 つは変換の組み合わせに使用され、もう 1 つは新しい変換を作成するために使用されます。

最初の呼び出しは、"Make" 呼び出しにすることができます。後続の呼び出しは、非メイク バリエーションである必要があります。

変換行列を生成する「Make」呼び出し:

CGAffineTransformMakeRotation(angle)

既存の変換行列を変更する非 make 呼び出し:

CGAffineTransformRotate(existingMatrix, angle)

だから、あなたのコードから:

CGAffineTransform totalTransform = 
      CGAffineTransformMakeTranslation(-middleX  , -middleY );
totalTransform = CGAffineTransformScale(totalTransform, 3.5f, 3.5f);
totalTransform = CGAffineTransformTranslate(totalTransform, middleX , middleY );
totalTransform = CGAffineTransformMakeRotation(angle);

最初の呼び出しで、必要に応じてマトリックスが作成されました。ただし、ローテーション コール (4 番目のコール) は次のようになります。

 totalTransform = CGAffineTransformRotate(totalTransform, angle);

それ以外の場合は、お気づきのように、その呼び出しの前にすべての変換を破棄し、この場合は回転、または最後の変換が何であれ、取得するだけです。

于 2013-03-25T04:43:48.997 に答える