gpt4 book ai didi

cocoa - 如何使基于trackingAreas的NSTableRowView drawBackgroundInRect在滚动时更新得足够快?

转载 作者:行者123 更新时间:2023-12-03 16:19:39 25 4
gpt4 key购买 nike

我正在使用基于 View 的 NSTableView 和自定义 NSTableRowView。我想通过使用trackingAreas基于鼠标位置通过drawBackgroundInRect使用自定义行背景绘图。目标是为鼠标当前悬停在其上的未选定行绘制自定义背景。

这实际上与 HoverTableView example 相同来自 WWDC 2011 session 基于 View 的 NSTableView 基本到高级。您可以在右侧帐户类型 TableView 的“邮件、联系人和日历”系统偏好设置 Pane 中看到该行为的实际效果。

与示例不同,我的 TableView 中有数千行。一切都如示例中所示,除非我快速滚动表格 View (例如,通过触控板用两根手指轻拂)。在这种情况下,似乎 updateTrackingAreas 的调用速度不够快。在鼠标下方滚动的行会突出显示,但永远不会通知鼠标离开其跟踪区域,因此保持突出显示状态。结果是多行显示鼠标悬停突出显示,并且由于重用队列,这些行将从 TableView 的一端滚动并重新出现在另一端(当然具有不同的数据)仍然突出显示,就像它们被鼠标悬停一样。缓慢滚动可以消除该问题;但考虑到我希望滚动数千行,缓慢滚动并不是预期的用户行为。

我尝试了 NSTrackingAreaOptions 的各种组合但无济于事,现在被难住了。任何有关解决此问题的建议将不胜感激。

最佳答案

我认为问题的答案是“你不能”,即快速滚动 NSTableViewNSTableRowViewupdateTrackingAreas 确实可以在运行循环上发生的速度不够快,无法依赖它来确定指针是否位于行 View 内。再次参见the HoverTableView example code查看 updateTrackingAreas 的使用位置。

我确实认为我有一个合适的解决方案。我注意到 Mac 版 Twitter ( RIP ) 的鼠标悬停 View 随着鼠标移动而出现,但在滚动时消失,与我希望实现的鼠标悬停高亮非常相似。

为了执行此操作,我基本上使我的自定义 NSTableRowView 有一个委托(delegate)(我的自定义 NSTableViewController),它会询问该委托(delegate)是否应该在悬停时突出显示。我为我的 NSTableView 使用了自定义的 NSScrollView 并调用了

    [self.contentView setPostsBoundsChangedNotifications:YES];

在其awakeFromNib中,并使其将self注册为该通知的观察者。收到该通知(这意味着我的表格 View 正在滚动)后,我的自定义 NSScrollView 会将消息转发到我的 NSTableViewController

当我的 NSTableViewController 收到表格 View 正在滚动的消息时,它会禁用鼠标悬停时的突出显示,并且如果还没有从上一个通知运行的有效计时器,则会触发一个短计时器滚动停止后重新启用鼠标悬停时的突出显示。作为额外的预防措施,在鼠标悬停时启用和禁用突出显示之间的状态转换时,我的 NSTableViewController 使用 enumerateAvailableRowViewsUsingBlock 清除每个行 View 的 mouseInside .

不确定这是否一定是最好的方法,但它达到了我想要的效果。

关于cocoa - 如何使基于trackingAreas的NSTableRowView drawBackgroundInRect在滚动时更新得足够快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531497/

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