DisplayLink

一个简化的 DisplayLink 抽象,适用于所有平台(包括 iOS、tvOS、watchOS、macOS、Linux)。

public final class DisplayLink : Publisher {
    public typealias Output = Frame
    public typealias Failure = Never
}

extension DisplayLink {
    public struct Frame {
        public var timestamp: TimeInterval
        public var duration: TimeInterval
    }
}
平台 实现
iOS, tvOS CADisplayLink
macOS CVDisplayLink
watchOS, Linux 定时器

包含一个带有 SwiftUI 集成的 Combine 发布者,用于 CADisplayLink

SwiftUI 目前没有提供任何 API 来执行基于帧的操作。 这个小型库简化了 CADisplayLink 和 SwiftUI 之间的桥接工作。

import DisplayLink

struct MyView: View {

    @State var offset: CGFloat = 0.0

    var body: some View {
        Color
            .red
            .frame(width: 40, height: 40)
            .offset(x: offset, y: offset)
            .onFrame { frame in
                self.offset += (frame.duration * 20.0)
            }
    }
}