- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用基于 View 的 NSTableView 和自定义 NSTableRowView。我想通过使用trackingAreas基于鼠标位置通过drawBackgroundInRect使用自定义行背景绘图。目标是为鼠标当前悬停在其上的未选定行绘制自定义背景。
这实际上与 HoverTableView example 相同来自 WWDC 2011 session 基于 View 的 NSTableView 基本到高级。您可以在右侧帐户类型 TableView 的“邮件、联系人和日历”系统偏好设置 Pane 中看到该行为的实际效果。
与示例不同,我的 TableView 中有数千行。一切都如示例中所示,除非我快速滚动表格 View (例如,通过触控板用两根手指轻拂)。在这种情况下,似乎 updateTrackingAreas 的调用速度不够快。在鼠标下方滚动的行会突出显示,但永远不会通知鼠标离开其跟踪区域,因此保持突出显示状态。结果是多行显示鼠标悬停突出显示,并且由于重用队列,这些行将从 TableView 的一端滚动并重新出现在另一端(当然具有不同的数据)仍然突出显示,就像它们被鼠标悬停一样。缓慢滚动可以消除该问题;但考虑到我希望滚动数千行,缓慢滚动并不是预期的用户行为。
我尝试了 NSTrackingAreaOptions 的各种组合但无济于事,现在被难住了。任何有关解决此问题的建议将不胜感激。
最佳答案
我认为问题的答案是“你不能”,即快速滚动 NSTableView
中 NSTableRowView
的 updateTrackingAreas
确实可以在运行循环上发生的速度不够快,无法依赖它来确定指针是否位于行 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/
我是一名优秀的程序员,十分优秀!