美文网首页花落√莫相思
80-Swift之CADisplayLink的解说

80-Swift之CADisplayLink的解说

作者: NetWork小贱 | 来源:发表于2017-10-31 17:38 被阅读77次

    引言

    在App的开发中定时器是常用的组件。我们在55 - Swift 之 Timer (NSTimer )定时器已经介绍了Timer。本篇我们将介绍CADisplayLink

    1、CADisplayLink 是什么?

    CADisplayLink 是一种触发时间和屏幕刷新频率相同的定时器。

    2、CADisplaylink 的基本使用方法。

    我们在项目中创建一个 CADisplayLink 的对象 A ,同时给他一个 target 和一个 Selector ; 然后,将 A 添加到 RunLoop 中,在屏幕刷新的时候就会触发 ASelector 方法。

    3、 CADisplayLink 的几个参数介绍

    1、 timestamp

    timestamp 是指当前帧开始刷新的时间。

    2、duration

    duration 是一帧刷新所用时的时间。

    3、 targetTimestamp

    targetTimestamp 是下一帧开始刷新的时间。

    注意:(默认情况下)
    targetTimestampdurationtimestamp默认情况下 之间的关系如下:
    timestamptargetTimestamp 相差 duration ;即是 :
    duration = targetTimestamp - timestamp 的关系。

    4、isPaused

    isPaused 是阻止屏幕刷新的进行的参数。isPaused 如果为 true 屏幕刷新停止。isPausedflase 屏幕开始刷新。

    5、invalidate() 函数

    invalidate() 这个函数我们并不陌生,我们在 OC 的 NSTime 和 Swift 的 Timer 中都见过它。invalidate() 该函数的作用是停止定时,同时释放定时器对象。

    6、open func add(to runloop: RunLoop, forMode mode: RunLoopMode) 函数

    open func add(to runloop: RunLoop, forMode mode: RunLoopMode) 该函数的作用是将创建的 CADisplayLink 对象加入到 RunLoop 中,才能在屏幕刷新的时候,执行定时器的 selector 方法。

    7、 open func remove(from runloop: RunLoop, forMode mode: RunLoopMode) 函数

    open func remove(from runloop: RunLoop, forMode mode: RunLoopMode) 该函数的作用是将添加的 CADisplayLink 对象从 RunLoop 中移除,停止定时作用,减轻Cup的负担。

    8 、 preferredFramesPerSecond

    preferredFramesPerSecond 该参数的作用是设置屏幕在一分钟内刷新的帧数。默认为60,当设置为0 的时候将和屏幕刷新频率相同,该参数在 ios 10.0 以上可是使用。

    4、 CADisplaylink 的使用

    // MARK: 创建一个CADisplayLink的对象
    func budlingDisplayLink() -> Void {
        // 创建对象
        let displayLink = CADisplayLink.init(target: self, selector: #selector(displayLinkClick(_:)))
        // 设置触发频率
        if #available(iOS 3.1, *) {
            //设置一秒内有几帧刷新,默认60,即是一秒内有60帧执行刷新调用。
            displayLink.preferredFramesPerSecond = 3
        }else {
            displayLink.frameInterval = 2
        }
        // 加入循环
        displayLink.add(to: RunLoop.main, forMode: .defaultRunLoopMode)
    }
    @objc func displayLinkClick(_ displayLink:CADisplayLink) -> Void {
        // 当前帧开始刷新的时间
        print(displayLink.timestamp)
        // 一帧刷新使用的时间
        print(displayLink.duration)
        // 下一帧开始刷新的时间
        print(displayLink.targetTimestamp)
        // TODO: displayLink.timestamp 与 displayLink.targetTimestamp 相差 displayLink.duration ;即是 : displayLink.duration  = displayLink.targetTimestamp - displayLink.timestamp 的关系。
        // 暂停帧的刷新 true:停 ; false:开始
        displayLink.isPaused = true
        // 将定时器移除主循环
        displayLink.remove(from: RunLoop.main, forMode: .defaultRunLoopMode)
        // 停止定时器
        displayLink.invalidate()
    }
    

    相关文章

      网友评论

        本文标题:80-Swift之CADisplayLink的解说

        本文链接:https://www.haomeiwen.com/subject/nymbpxtx.html