刷帧

刷帧一般图形

- (void)drawRect:(CGRect)rect;

以上的方法是在view***第一次*显示时调用,要使其重复调用,手动调用是不生效的,需要调用刷帧方法。
一般图形刷帧主要通过以下两个方法:

- (void)setNeedsDisplay; - (void)setNeedsDisplayInRect:(CGRect)rect;

如以下代码:

// 绘制一个圆
// 通过重写radius的setter,并修改radius,调用setNeedsDisplay方法来使drawRect:方法重新调用,从而实现刷帧功能
- (void)setRadius:(float)radius
{
    _radius = radius;

    // 2.通知自定义view重新绘制图形
    [self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect
{
    // 1.获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 2.绘图
    CGContextAddArc(ctx, 100, 100, self.radius, 0, 2 * M_PI, 0);

    [[UIColor purpleColor] set];
    // 3.渲染
    CGContextFillPath(ctx);
}

刷帧动画

动画刷帧实现可以用定时刷帧来实现,一般有以下两种方式实现定时:

// 1
// NSTimer一般用于定时的更新一些非界面上的数据
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updataImage) userInfo:nil repeats:YES];

// 2
// 创建CADisplayLink, 默认每秒60次
CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@selector(updataImage)];
// 将CADisplayLink加入到消息循环中
[display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

代码示例:

-(void)awakeFromNib
{
    // 创建CADisplayLink, 默认每秒60次
    CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@selector(updataImage)];
    // 将CADisplayLink加入到消息循环中
    [display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
// 因为xib也是通过归档来实现加载的,所以在调用awakeFromNib前会先调用initWithCoder:
// 所以以上方法也可以用以下方法实现
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCode:aDecoder]) {
        // NSTimer一般用于定时的更新一些非界面上的数据
       // [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updataImage) userInfo:nil repeats:YES];

        // 创建CADisplayLink, 默认每秒60次
        CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@selector(updataImage)];
        // 将CADisplayLink加入到消息循环中
        [display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    }
    return self;
}
- (void)updataImage
{
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    self.imageY += 5;

    if (self.imageY > rect.size.height) {
        self.imageY = 0;
    }
    // Drawing code
    UIImage *image = [UIImage imageNamed:@"snow"];
    [image   drawAtPoint:CGPointMake(10, self.imageY)];
}

你可能感兴趣的:(刷帧)