Xcode 图像旋转 toValue 和 fromValue
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9034934/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Xcode image rotation toValue and fromValue
提问by Maurice
I want to turn an image 190 degrees when pressing a button. That works but when i press the button again the animation needs to start where it last ended, instead of starting from 0. So everytime i press the button, the animation need to turn a 190 degrees.
我想在按下按钮时将图像旋转 190 度。这有效,但是当我再次按下按钮时,动画需要从上次结束的位置开始,而不是从 0 开始。所以每次我按下按钮时,动画都需要旋转 190 度。
It is starting at 0 everytime becouse my fromValue is set to 0.
每次都从 0 开始,因为我的 fromValue 设置为 0。
Does someone know how i can make the fromValue start where my image ends. My code is below here.
有人知道我如何让 fromValue 从我的图像结束的地方开始。我的代码在下面。
- (IBAction)buttonPressed
{
CABasicAnimation *imageRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
imageRotation.fromValue = [NSNumber numberWithFloat:0];
imageRotation.toValue = [NSNumber numberWithFloat:((190*M_PI)/ -180)];
imageRotation.duration = 1.5;
imageRotation.repeatCount = 1;
imageRotation.removedOnCompletion = NO;
imageRotation.autoreverses=NO;
imageRotation.fillMode = kCAFillModeForwards;
[image.layer addAnimation:imageRotation forKey:@"imageRotation"];
}
回答by Maurice
Thanks for your answer, but here is how i did it. Hope people can use this :D
感谢您的回答,但我是这样做的。希望人们可以使用这个:D
My .h file looks like this:
我的 .h 文件如下所示:
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface testViewController : UIViewController {
IBOutlet UIImageView *image;
NSObject *lastValue;
}
- (IBAction)buttonPressed;
@property(nonatomic, retain) IBOutlet NSObject *lastValue;
@end
My .m file looks like this:
我的 .m 文件如下所示:
@synthesize lastValue;
- (void)viewAnimation0
{
CABasicAnimation *imageRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
imageRotation.fromValue = lastValue;
imageRotation.toValue = [NSNumber numberWithFloat:((30*M_PI)/ -180)];
lastValue = imageRotation.toValue;
imageRotation.duration = 1.5;
imageRotation.repeatCount = 1;
imageRotation.removedOnCompletion = NO;
imageRotation.autoreverses=NO;
imageRotation.fillMode = kCAFillModeForwards;
[image.layer addAnimation:imageRotation forKey:@"imageRotation"];
}
- (void)viewAnimation1
{
CABasicAnimation *imageRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
imageRotation.fromValue = lastValue;
imageRotation.toValue = [NSNumber numberWithFloat:((60*M_PI)/ -180)];
lastValue = imageRotation.toValue;
imageRotation.duration = 1.5;
imageRotation.repeatCount = 1;
imageRotation.removedOnCompletion = NO;
imageRotation.autoreverses=NO;
imageRotation.fillMode = kCAFillModeForwards;
[image.layer addAnimation:imageRotation forKey:@"imageRotation"];
}
- (void)viewAnimation2
{
CABasicAnimation *imageRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
imageRotation.fromValue = lastValue;
imageRotation.toValue = [NSNumber numberWithFloat:((90*M_PI)/ -180)];
lastValue = imageRotation.toValue;
imageRotation.duration = 1.5;
imageRotation.repeatCount = 1;
imageRotation.removedOnCompletion = NO;
imageRotation.autoreverses=NO;
imageRotation.fillMode = kCAFillModeForwards;
[image.layer addAnimation:imageRotation forKey:@"imageRotation"];
}
- (IBAction)buttonPressed
{
static int counter = 0;
switch (++counter) {
case 1:
[self viewAnimation1];
break;
case 2:
[self viewAnimation2];
break;
default:
[self viewAnimation0];
counter = 0;
break;
}
// animateButton.enabled = NO;
}
回答by rob mayoff
You need to do two things: you need to actually set the rotation of the layer (instead of setting removedOnCompletion = NO
), and you need to not set the fromValue
.
您需要做两件事:您需要实际设置图层的旋转(而不是设置removedOnCompletion = NO
),并且您不需要设置fromValue
.
- (IBAction)buttonPressed
{
CABasicAnimation *imageRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
imageRotation.toValue = [NSNumber numberWithFloat:((190*M_PI)/ -180)];
imageRotation.duration = 1.5;
imageRotation.repeatCount = 1;
[image.layer setValue:imageRotation.toValue forKey:imageRotation.keyPath];
[image.layer addAnimation:imageRotation forKey:@"imageRotation"];
}
Watch the Core Animation Essentialsvideo from WWDC 2011to understand why you need to set the layer's property instead of setting removedOnCompletion = NO
.
观看WWDC 2011的Core Animation Essentials视频,了解为什么需要设置图层的属性而不是设置.removedOnCompletion = NO