iOS 帧动画

本文详细介绍了如何使用CADisplayLink在Swift中实现每秒一次的方法调用,包括实例代码、属性解释、修改频率示例以及总结。通过调整frameInterval属性,可以控制方法调用的频率,同时展示了如何在方法中处理时间戳和调用次数。
摘要由CSDN通过智能技术生成

1. 实例代码

1.1添加成员属性

@property (nonatomic,strong) CADisplayLink *link;
@property (nonatomic,assign) CFTimeInterval startTime ;
1.2实例化displayLink,把link添加进runloop

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
    [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

}

1.3实现监听方法

- (void)update:(CADisplayLink *)sender
{
    // 判断是否第一次执行此方法
    if (self.startTime == 0) {
        self.startTime = sender.timestamp; //把link的时间戳赋值给startTime
    }

    CFTimeInterval deltaTime = sender.timestamp - self.startTime;
    // 每次执行此方法都会判断传进来的时间戳 和 存储的startTime 之差是否>= 1
    if (deltaTime >= 1) {
        NSLog(@"每秒输出1次");
        self.startTime = sender.timestamp; // 更新存储的startTime
    }
}

1.4打印结果

2014-12-20 15:54:36.634 帧动画[11110:60b] 每秒输出1次

2014-12-20 15:54:37.651 帧动画[11110:60b] 每秒输出1次

2014-12-20 15:54:38.667 帧动画[11110:60b] 每秒输出1次

2014-12-20 15:54:39.684 帧动画[11110:60b] 每秒输出1次

2014-12-20 15:54:40.684 帧动画[11110:60b] 每秒输出1次

2014-12-20 15:54:41.701 帧动画[11110:60b] 每秒输出1次

2014-12-20 15:54:42.702 帧动画[11110:60b] 每秒输出1次

1.5CADisplayLink的其他属性

修改一下实例代码

#import "QKViewController.h"

@interface QKViewController ()

- (IBAction)pauseButton;
@property (nonatomic,strong) CADisplayLink *link;
@property (nonatomic,assign) CFTimeInterval startTime ;

@end

@implementation QKViewController
// 记录update第几次被调用
static int count;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 初始化link
    self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
    // 添加进runloop
    [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    // 打印调方法前的属性值
    NSLog(@"默认的frameInterval = %d",self.link.frameInterval);
    NSLog(@"调用前: duration = %f,timestamp = %f",self.link.duration,self.link.timestamp);
    // 修改调用频率,改成60,意味着屏幕刷新60次,才去调用update:方法
    self.link.frameInterval = 60;


}

- (void)update:(CADisplayLink *)sender
{
    // 每调一下update:方法,记录调用次数
    count ++;
    // 打印调用时的属性值
    NSLog(@"duration = %f , timestamp = %f ,第%d次调用",self.link.duration,self.link.timestamp,count);
    // 调用60次后,移除Link
    if (count == 60) {
        [self.link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    }

}

// 点击storyboard的按钮触发该方法:pause属性的示例,它是个BOOL值,可以让Link开始或停止
- (IBAction)pauseButton {
    self.link.paused =  !self.link.paused;
    // 停用Link,一定要调 -(void)invalidate
    [self.link invalidate];
    // 安全起见,把指针清空
    self.link = nil;
}

2014-12-20 16:58:15.465 帧动画[11680:60b] 默认的frameInterval = 1

2014-12-20 16:58:15.466 帧动画[11680:60b] 调用前: duration = 0.000000,timestamp = 0.000000

2014-12-20 16:58:15.474 帧动画[11680:60b] duration = 0.016667 , timestamp = 80880.508529 ,第1次调用

2014-12-20 16:58:16.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80881.500962 ,第2次调用

2014-12-20 16:58:17.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80882.500537 ,第3次调用

2014-12-20 16:58:18.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80883.500228 ,第4次调用

2014-12-20 16:58:19.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80884.499834 ,第5次调用

2014-12-20 16:58:20.467 帧动画[11680:60b] duration = 0.016667 , timestamp = 80885.500925 ,第6次调用

1.6总结

默认frameInterval=1, 1代表屏幕刷新1次,就调1次方法.改成60,意味着屏幕刷新60次,才调一次方法

调方法前: duration = 0.000000,timestamp = 0.000000,只有调用方法后,这2个属性才有值

无论修改frameInterval数值为多少,duration都不会变,duration代表相邻2次屏幕刷新时间的时间间隔,由苹果控制

timestamp,是CAAnimation的时间格式,格式比较特殊.有点像计算机时间,相对1907.1.1的偏移量.








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值