【问题标题】:Objective-c Control Transform RotationObjective-c 控制变换旋转
【发布时间】:2013-01-29 02:48:07
【问题描述】:

我有一个图像网格,我在单击图像时会放大和缩小。一切正常,但我无法控制 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;
      }

【问题讨论】:

    标签: ios transform cgaffinetransform cgaffinetransformscale


    【解决方案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);
    

    否则,正如您所注意到的,您会在调用之前丢弃所有转换,并且只会获得旋转,在这种情况下,或者无论您最后一次转换是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2011-12-17
      相关资源
      最近更新 更多