老谭笔记

NSView的自定义动画更简单

之前写过几篇关于Mac动画的系列文章,当今天在工作中写一个动画Demo时才发现那一系列的文章应该少了一篇才是,最近工作变动之后很久都没有来更新过博客了,所以今天来发一篇小小的技术文章,其实也就几句代码能搞定的事儿,只是可能被你忽略了而已。

CustomAnimationDemo

之前那系列关于动画的文章中一篇分享了如何为CALayer自定义动画,虽然代码也很简单,但毕竟还是要去实现两三个方法,其实用NSView去实现一个自定义的动画就显得更简单了,几乎可以算是只需要去实现一个方法,以下就是完整的代码:

此处忽略了头文件,头文件只是定义了一个属性progress而已

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#import "THAnimationView.h"
#import <QuartzCore/QuartzCore.h>
@implementation THAnimationView
@synthesize progress;
- (double)progress
{
return progress;
}
//此处必需去刷新界面,否则动画无效
- (void)setProgress:(double)value
{
progress = value;
[self setNeedsDisplay:YES];
}
//画一道弧线,用来展示动画
- (void)drawRect:(NSRect)dirtyRect
{
NSBezierPath *path = [NSBezierPath bezierPath];
NSPoint center = NSMakePoint(NSMidX(self.bounds), NSMidY(self.bounds));
[path appendBezierPathWithArcWithCenter:center radius:50 startAngle:0 endAngle:360*progress clockwise:NO];
[path setLineWidth:10];
[[NSColor redColor] set];
[path stroke];
}
//这就是你需要去实现的一个方法,根据属性返回一个动画对象
+ (id)defaultAnimationForKey:(NSString *)key
{
if ([key isEqualToString:@"progress"])
{
return [CABasicAnimation animation];
}else
{
return [super defaultAnimationForKey:key];
}
}
@end

当你需要展示动画时,只需要这样使用即可:

1
[[animationView animator] setProgress:1.0];

如果需要设置指定的动画时间,你还可以这样使用:

1
2
3
4
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:1.0];
[[animationView animator] setProgress:1.0];
[NSAnimationContext endGrouping];

以下Demo的完整源代码下载:CustomAnimationDemo.zip