实现动画方式深度解析(二十三) —— CoreGraphic动画(一)

版本记录

版本号 时间
V1.0 2017.09.27

前言

app中好的炫的动画可以让用户耳目一新,为产品增色不少,关于动画的实现我们可以用基本动画、关键帧动画、序列帧动画以及基于CoreGraphic的动画等等,接下来这几篇我就介绍下我可以想到的几种动画绘制方法。具体Demo示例已开源到Github —— 刀客传奇,感兴趣的可以看我写的另外几篇。
1. 实现动画方式深度解析(一) —— 播放GIF动画(一)
2. 实现动画方式深度解析(二) —— 播放GIF动画之框架FLAnimatedImage的使用(二)
3. 实现动画方式深度解析(三) —— 播放序列帧动画(一)
4. 实现动画方式深度解析(四) —— QuartzCore框架(一)
5. 实现动画方式深度解析(五) —— QuartzCore框架之CoreAnimation(二)
6. 实现动画方式深度解析(六) —— Core Animation Basics(三)
7. 实现动画方式深度解析(七) —— Core Animation之Setting Up Layer Objects(四)
8. 实现动画方式深度解析(八) —— Core Animation之动画层内容 (五)
9. 实现动画方式深度解析(九) —— Core Animation之构建图层层级 (六)
10. 实现动画方式深度解析(十) —— Core Animation之高级动画技巧 (七)
11. 实现动画方式深度解析(十一) —— Core Animation之更改图层的默认行为(八)
12. 实现动画方式深度解析(十二) —— Core Animation之提高动画的性能(九)
13. 实现动画方式深度解析(十三) —— Core Animation之图层样式属性动画(十)
14. 实现动画方式深度解析(十四) —— Core Animation之 KVC 扩展(十一)
15. 实现动画方式深度解析(十五) —— Core Animation之可动画属性 (十二)
16. 实现动画方式深度解析(十六) —— Core Animation之CABasicAnimation动画示例 (十三)
17. 实现动画方式深度解析(十七) —— Core Animation之CAKeyframeAnimation动画示例 (十四)
18. 实现动画方式深度解析(十八) —— UIView动画 (一)
19. 实现动画方式深度解析(十九) —— Lottie - iOS动画 (一)
20. 实现动画方式深度解析(二十) —— Lottie - iOS动画之示例分享 (二)
21. 实现动画方式深度解析(二十一) —— Keyframes动画之框架基本 (一)
22. 实现动画方式深度解析(二十二) —— Keyframes动画之简单示例(二)

功能要求

关于CoreGraphic这个框架的基本情况就不多说了,前面我写过这个框架的一些东西,相信大家对它多少有一定的了解。

在我们利用CoreGraphic进行动画之前还是要给大家看一下相关的架构。

实现动画方式深度解析(二十三) —— CoreGraphic动画(一)_第1张图片

它是一个C语言框架,也不是处理动画的专门框架,可以看见他的顶层是CoreAnimation,CoreAnimation是专门处理动画的,底层封装的就是CoreGraphic,这里给大家介绍利用CoreGraphic进行动画,只是给大家提供了一种额外做动画的可能性,在实际动画实现中还有很多其他方案可供参考。


功能实现

下面我们直接看代码

1. ViewController.m
#import "ViewController.h"
#import "JJCoreGraphicView.h"

@interface ViewController ()

@property (nonatomic, strong) JJCoreGraphicView *coregraphicView;
@property (nonatomic, assign) CGFloat progress;
@property (nonatomic, strong) NSTimer *timer;

@end

@implementation ViewController

#pragma mark -  Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    JJCoreGraphicView *coregraphicView = [[JJCoreGraphicView alloc] initWithFrame:self.view.frame];
    coregraphicView.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:coregraphicView];
    self.coregraphicView = coregraphicView;
    
    self.progress = 0.0;
    
    [self setupTimer];
}

#pragma mark -  Object Private Function

- (void)setupTimer
{
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerDidWork) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    self.timer = timer;
}

#pragma mark -  Action && Notification

- (void)timerDidWork
{
    if (self.progress >= 1.0) {
        [self.timer invalidate];
        self.timer = nil;
        return;
    }
    self.coregraphicView.progress = self.progress;
    self.progress += 0.1;
}

@end
2. JJCoreGraphicView.h
#import 

@interface JJCoreGraphicView : UIView

@property (nonatomic, assign) CGFloat progress;

@end
3. JJCoreGraphicView.m
#import "JJCoreGraphicView.h"

@implementation JJCoreGraphicView

#pragma mark -  Override Base Function

- (void)drawRect:(CGRect)rect
{
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    
    CGPoint center = CGPointMake(200.0, 300);
    CGFloat radius = 100.0;
    CGFloat startAngle = - M_PI_2;
    CGFloat endAngle = - M_PI_2 + self.progress * M_PI * 2;
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
    
    [path setLineWidth:5.0];
    [[UIColor blueColor] setStroke];
    
    CGContextAddPath(contextRef, path.CGPath);
    
    CGContextStrokePath(contextRef);
}

#pragma mark -  Getter && Setter

- (void)setProgress:(CGFloat)progress
{
    _progress = progress;
    
    [self setNeedsDisplay];
}

@end

代码不是很多,具体就是利用定时器,控制一个变量的值,在定义view中不断更改值和重绘,达到了动画的效果。


功能效果

下面我们就看一下功能效果。

实现动画方式深度解析(二十三) —— CoreGraphic动画(一)_第2张图片

可见,可以实现简单的动画。

后记

未完,待续~~~~

实现动画方式深度解析(二十三) —— CoreGraphic动画(一)_第3张图片

你可能感兴趣的:(实现动画方式深度解析(二十三) —— CoreGraphic动画(一))