一:Animation Timing Curves
1:Linear Animation Timing
2:Ease-In Animation Timing
3:Ease-Out Animation Timing
4:Ease-In Ease-Out Animation Timing
5:Custom Animation Timing
自定義動畫執行曲線設置
We create a custom timing with the initWithControlPoints:::: method on CAMediaTimingFunction like this:
- - (CAMediaTimingFunction *)getTimingFunction {
- CGFloat c1x = 0.5;
- CGFloat c1y = 1.0;
- CGFloat c2x = 0.5;
- CGFloat c2y = 0.0;
- return [[CAMediaTimingFunction alloc initWithControlPoints:cx1 :cy1 :cx2 :cy2];
- }
points. In our example, we set the first control point to {0.5, 1.0} and the second control point to {0.5, 0.0}.
- -(void)setupMover {
- NSRect bounds = self.bounds;
- NSRect moverFrame =NSInsetRect(bounds, NSWidth(bounds) / 4.0f,NSHeight(bounds) / 4.0f);
- moverFrame.origin.x = 0.0f;
- mover = [[NSImageView alloc] initWithFrame:moverFrame];
- [mover setImageScaling:NSScaleToFit];
- [mover setImage:[NSImage imageNamed:@"photo.jpg" ]];
- [self addSubview:mover];
- }
- - (id)initWithFrame:(NSRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- [self setupMover];
- }
- return self;
- }
- - (BOOL)acceptsFirstResponder {
- return YES;
- }
- - (void)keyDown:(NSEvent *)event {
- [self move];
- }
- - (CABasicAnimation *)moveAnimation {
- if(nil == moveAnimation) {
- moveAnimation = [CABasicAnimation animation];
- moveAnimation.duration = 2.0f;
- moveAnimation.timingFunction =
- [[CAMediaTimingFunction alloc]
- initWithControlPoints:0.5 :1.0 :0.5 :0.0];
- }
- return moveAnimation;
- }
- - (void)move {
- NSDictionary *animations = [NSDictionary
- dictionaryWithObject:[self moveAnimation]
- forKey:@"frameOrigin" ];
- [mover setAnimations:animations];
- NSPoint origin = mover.frame.origin;
- origin.x += NSWidth(mover.frame);
- [mover.animator setFrameOrigin:origin];
- }