我试图在旋转它的同时滑入UIView。最终的结果基本上是一个UIView,拉过屏幕向左旋转约70度,击中边缘,向右旋转约50度,最后结束静止(经过几次摆动)。我可以让它滑动和旋转,但是当我尝试为第二次旋转设置动画时(一旦它碰到边缘),框架就会回到原始值(返回到屏幕左侧)。一旦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) {
}];
答案 0 :(得分:1)
在第一个动画块中,您正在创建包含平移和旋转的变换。在第二个动画块中,您将创建一个包含旋转但不包含平移的变换。因此,当您为第二个变换设置动画时,您的视图不再被翻译。
我看到您使用了UIViewAnimationOptionBeginFromCurrentState
选项。您可能认为此选项使第一个变换堆栈成为第一个,但事实并非如此。无论选项如何,第二个转换都会替换第一个转换。
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;
}];
}
}];
}
答案 1 :(得分:0)
当您创建第二个转化rightAngle1
时,您应该使用[[self ticketImageView] transform]
而不是CGAffineTransformIdentity
。使用身份转换,您基本上擦除了第一个转换并从头开始。