2012-07-18 166 views
0

我想滑动UIView同时也旋转它。最终的结果基本上是一个UIView,它在屏幕上向左旋转约70度,碰到边缘,向右旋转约50度,最后结束静止(在几次摆动之后)。我可以让它滑动和旋转,但是当我尝试对第二个旋转进行动画处理时(一旦它碰到边缘),框架会回到原始值(回到屏幕的左侧)。一旦UIView滑过,我该如何获取框架?幻灯片和旋转UIView

[UIView animateWithDuration:.4 delay:0.0 
        options:UIViewAnimationCurveEaseInOut 
       animations:^{ 
        CGAffineTransform slideAndRotate = CGAffineTransformMakeTranslation(300, 0); 
        slideAndRotate = CGAffineTransformRotate(slideAndRotate, RADIANS(75)); 

        self.ticketImageView.transform = slideAndRotate;     
} completion:^(BOOL finished) { 
    // set the frame to the location where it ended up 
    NSLog(@"%@", NSStringFromCGRect(self.ticketImageView.frame)); 
    [UIView animateWithDuration:.35 
          delay:0.05 
         options:UIViewAnimationCurveEaseInOut 
    | UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         CGAffineTransform rightAngle1 = 
         CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-45.0)); 
         [[self ticketImageView] setTransform:rightAngle1]; 
    } completion:^(BOOL finished) { 

    }]; 

回答

1

在您的第一个动画块中,您正在创建包含平移和旋转的变换。在第二个动画块中,您正在创建包含旋转但不包含翻译的变换。因此,当您创建第二个转换动画时,您的视图不再被翻译。

我看到你已经使用了UIViewAnimationOptionBeginFromCurrentState选项。你可能会认为这个选项使第一个变换堆栈变成了第二个,但它不是。无论选项如何,第二个转换都会替换第一个转换。

A UIView有两个影响其位置的属性。一个是transform,你正在使用。另一个是center

通常我们使用center属性来移动视图,只使用transform属性来旋转和缩放视图。我建议你也这样做。

既然你说你要视图摇晃几次,我建议你尝试这样的事:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    [UIView animateWithDuration:0.4 animations:^{ 
     self.ticketImageView.center = CGPointMake(180, self.ticketImageView.center.y); 
    }]; 

    [self wobbleWithAmount:0.4 direction:1]; 
} 

- (void)wobbleWithAmount:(CGFloat)amount direction:(CGFloat)direction { 
    [UIView animateWithDuration:amount animations:^{ 
     self.ticketImageView.transform = CGAffineTransformMakeRotation(amount * direction * M_PI * 0.5f); 
    } completion:^(BOOL finished) { 
     if (amount > 0.05f) { 
      [self wobbleWithAmount:amount * 0.5f direction:-direction]; 
     } else { 
      [UIView animateWithDuration:amount * 0.5f animations:^{ 
       self.ticketImageView.transform = CGAffineTransformIdentity; 
      }]; 
     } 
    }]; 
} 
+0

感谢您的精彩提示!使用中心肯定比翻译坐标容易得多!这个算法效果很好。 – Clay 2012-07-19 02:21:03

0

当您创建第二变换rightAngle1,你应该用[[self ticketImageView] transform]代替CGAffineTransformIdentity。使用标识转换,您基本上会擦除第一个转换并从头开始。