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

这是一个老问题——但万一有人回过头来:

当您进行一系列转换时,您需要使用正确的调用。每种类型的变换(旋转、平移、缩放)有两个调用。一种用于组合变换,另一种用于进行新的变换。

第一个呼叫可以是“Make”呼叫。随后的调用需要是非制造品种。

"Make" 调用,生成一个变换矩阵:

CGAffineTransformMakeRotation(angle)

non-make call,它修改现有的转换矩阵:

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 回答