gpt4 book ai didi

objective-c - 如何允许用户在不暂停应用程序更新循环的情况下调整 NSSlider?

转载 作者:行者123 更新时间:2023-12-03 16:27:04 24 4
gpt4 key购买 nike

注意:更新如下...

我有一个 cocoa 桌面应用程序,它由一系列围绕自定义 NSView 的控件组成。我正在使用 displayLink 来驱动更新。

当用户单击 NSControl( slider 、按钮、复选框、单选按钮)时,应用程序似乎会卡住,直到释放鼠标为止。事实上,我可以确认 displayLink 回调(getFrameForTime)在此期间没有触发。如果我创建一个计时器,它也不会触发,两者都会保持暂停状态,直到用户释放鼠标,此时应用程序将恢复更新。

控件已绑定(bind),如果我从另一个线程更新该值(例如,通过 MIDI 接口(interface)的回调), slider 将按预期运行:它移动,值更新并且应用程序不会暂停。

我觉得这应该是一个相当明显的修复,但我很困惑。

  • 在 IB 中检查“连续”正如所宣传的那样:连续发送值,但在释放鼠标之前仍会表现出此行为(阻止 UI 更新)。

  • 这似乎与 NSControl 上的 mouseDown 特别相关?为什么这个会被阻止,我真的需要子类化所有 UI 元素来改变这种行为(看起来很极端)

  • DisplayLink 是在它自己的线程中,那么为什么主线程上的 mouseDown 会阻塞呢?如果是这种情况,鉴于禁止从主线程以外的地方更新 Cocoa UI,我该如何处理?

非常感谢任何帮助。

更新

根据@Nikolai 下面的评论,我可以确认使用 NSTimer 并将其添加到 NSEventTrackingRunLoopMode 不会阻塞。但是,我真的很想使用 CVDisplayLink,它(根据文档)在它自己的线程中运行,不应该以这种方式被阻止。与 CADisplayLink 不同,我找不到一种方法来显式地将运行循环分配给 CVDisplayLink (似乎它不起作用),所以也许新问题应该是:

为什么 CVDisplayLink 在 NSEventTrackingRunLoopMode 上阻塞?

最佳答案

当单击 NSControl 时,只要按下鼠标,运行循环模式就会从 NSDefaultRunLoopMode 变为 NSEventTrackingRunLoopMode。这意味着只有已添加到此模式的运行循环源(显示链接)和计时器才会触发。

您可以使用-[NSRunLoop addTimer:forMode:]将计时器添加到任何模式。对于显示链接,等效方法是 -[CADisplayLink addToRunLoop:forMode:]

要使动画在事件跟踪期间继续,您可以执行以下操作:

[myDisplayLink addToRunLoop:[NSRunLoop currentRunLoop]
forMode:NSEventTrackingRunLoopMode];

关于objective-c - 如何允许用户在不暂停应用程序更新循环的情况下调整 NSSlider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18510264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com