macOS平台下如何实现CADisplayLink.init(target:selector:)的等效功能?
关于macOS平台替代CADisplayLink.init(target:selector:)的疑问
CADisplayLink支持以下平台:
- iOS
- iPadOS
- macOS
- Mac Catalyst
- tvOS
- visionOS
但 CADisplayLink.init(target:selector:) 在 macOS 平台不可用。请问在该平台实现相同行为的正确方式是什么?
解决方案
在macOS上,你可以通过NSRunLoop提供的方法创建并使用CADisplayLink,实现和init(target:selector:)完全一致的屏幕同步刷新行为,具体步骤如下:
创建CADisplayLink实例
使用NSRunLoop.current.addDisplayLink(withTarget:selector:)方法直接创建并绑定到当前RunLoop,该方法会返回可用的CADisplayLink对象:let displayLink = NSRunLoop.current.addDisplayLink(withTarget: self, selector: #selector(handleFrameUpdate))配置刷新参数
可根据需求设置帧率、绑定的RunLoop模式,和iOS平台用法一致:// 设置每秒刷新60帧 displayLink.preferredFramesPerSecond = 60 // 将displayLink添加到指定RunLoop模式(可选,默认已添加到default模式) displayLink.add(to: .current, forMode: .common)实现刷新回调
编写对应的选择器方法,在每次屏幕垂直同步时执行业务逻辑:@objc func handleFrameUpdate(_ displayLink: CADisplayLink) { // 执行帧更新操作,比如动画帧刷新、实时绘制等 }停止并释放
当不再需要刷新时,调用invalidate()方法终止displayLink:displayLink.invalidate()
这种方式本质上和iOS平台的CADisplayLink.init(target:selector:)逻辑一致,都是绑定到RunLoop并跟随屏幕刷新信号触发回调,能保证动画或实时绘制的流畅性。
内容的提问来源于stack exchange,提问作者Marc_Alx
相关产品推荐
相关产品推荐

