Cocoa中NSAnimation動畫簡介

Cocoa中能夠經過NSAnimation能夠實現自定義動畫。NSAnimation自己並無任何的操做UI的能力,可是它可以提供相似NSTimer的定時功能,不過更增強大,經過設置progress mark能夠設置多個觸發點。對於須要平滑動做的,更是能夠經過繼承NSAnimation,在重寫一些方法後能提供精確到幀的動畫。須要注意的是,NSAnimation默認的動畫執行模式爲阻塞執行,須要等待動畫執行完纔會返回,能夠經過setAnimationBlockingMode:進行設置。函數

1. 經過代理獲取觸發點,執行動畫操做。跳躍性執行,須要設置較多的觸發點。動畫

 1 - (IBAction)didAnimateClicked:(id)sender {
 2     //建立時長爲5s的動畫並設置時間曲線
 3     NSAnimation *animation = [[NSAnimation alloc] initWithDuration:5 animationCurve:NSAnimationEaseIn];
 4     //設置代理
 5     [animation setDelegate:self];
 6     //設置關鍵點
 7     [animation setProgressMarks:@[@0.1, @0.2, @0.5, @1.0]];
 8     //設置阻塞模式,默認爲阻塞
 9     [animation setAnimationBlockingMode:NSAnimationNonblocking];
10     //開始執行動畫
11     [animation startAnimation];
12 }

須要經過設置代理來獲取時間點進行操做。spa

 1 - (void)animationDidEnd:(NSAnimation *)animation {
 2     NSLog(@"animation ended!");
 3 }
 4 
 5 - (void)animationDidStop:(NSAnimation *)animation {
 6     NSLog(@"animation stopped");
 7 }
 8 
 9 //關鍵點代理方法
10 - (void)animation:(NSAnimation *)animation didReachProgressMark:(NSAnimationProgress)progress
11 {
12     NSLog(@"progress: %f", progress);
13     
14     NSRect winRect = [[NSApp mainWindow] frame];
15     NSRect screenRect = [[NSScreen mainScreen] visibleFrame];
16     winRect.origin.x = progress * (screenRect.size.width - winRect.size.width);
17     [[NSApp mainWindow] setFrame:winRect display:YES];
18 }

2. 經過繼承NSAnimation執行動畫操做。(流暢動畫).net

1 //自定義動畫類
2 - (IBAction)didCustomAnimateClicked:(id)sender {
3     YGYCustomAnimation *animation = [[YGYCustomAnimation alloc] initWithDuration:5 animationCurve:NSAnimationEaseIn];
4     [animation setAnimationBlockingMode:NSAnimationNonblocking];
5     [animation startAnimation];
6 }

直接重寫函數:代理

1 #import <Cocoa/Cocoa.h>
2 
3 @interface YGYCustomAnimation : NSAnimation
4 
5 @end
 1 #import "YGYCustomAnimation.h"
 2 
 3 @implementation YGYCustomAnimation
 4 
 5 //自定義動畫類必須實現的方法
 6 - (void)setCurrentProgress:(NSAnimationProgress)progress
 7 {
 8     //必須調用super
 9     [super setCurrentProgress:progress];
10     
11     //窗口從左平滑右移
12     NSRect winRect = [[NSApp mainWindow] frame];
13     NSRect screenRect = [[NSScreen mainScreen] visibleFrame];
14     winRect.origin.x = progress * (screenRect.size.width - winRect.size.width);
15     [[NSApp mainWindow] setFrame:winRect display:YES];
16 }
17 
18 @end

 

更多信息:長沙戴維營教育code

相關文章
相關標籤/搜索