我希望在桌面视图上悬停时更改文本背景颜色,类似于当鼠标悬停标签名称时,AddressBook“突出显示”联系人元素的标签。但是我无法弄清楚如何完成......
检测特定NSCell上的鼠标悬停并... 在检测到他盘旋的单元格后,突出显示该单元格中的文本(不突出显示整行,就像用户选择该行一样)
由于NSCell不是NSView的子类,因此这似乎是一项非常困难的任务。
非常感谢任何关于如何做到这一点或解释的例子。
谢谢!
答案 0 :(得分:10)
我实际上是使用其他方法工作了。我从这里发布的例子中得到了它... http://www.cocoadev.com/index.pl?NSTableViewRollover
https://web.archive.org/web/20111013060111/http://cocoadev.com/index.pl?NSTableViewRollover
我没有使用NSCell的跟踪机制,而是在我的子类NSTableView中跟踪mouseEntered / mouseExited和mouseMoved。
当调用tableview awakeFromNib方法时,我从tableview的可见部分创建一个trackingRect
我有一个BOOL ivar,当鼠标位于跟踪区域(mouseEntered)时设置为YES,当它不在时,设置为NO(mouseExited)
在mouseMoved方法中,我确定鼠标光标所在的当前行并将其设置为NSInteger ivar,然后调用tableview的setNeedsDisplayInRect:传递鼠标所在行的矩形。
我还覆盖resetCursorRects以删除旧的跟踪矩形并添加一个新的...当滚动tableview时调用此方法,以便它跟踪最新的可见rect。
最后在我的tableview的委托中,我确定所选行(通过从表视图的NSInteger ivar中检索行索引并更改单元格的文本颜色(或任何你想要的),如果当前绘制的单元格与所有这些都在委托方法中完成:tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn行:(NSInteger)rowIndex
我希望这有助于其他人,因为这有点棘手。确保tableview是视图加载时的第一个响应者也很重要,只需使事情更简洁,更清晰。
是的,有没有办法在视图中进行特定控制总是第一个响应者,没有其他可能作为第一个响应者?甚至像iPhone这样的方法... viewWillAppear方法也会有所帮助,因为每当视图可见时我都可以设置第一个响应者...但我不知道Mac上有这样的方法。答案 1 :(得分:3)
总的来说,这并不像你注意到的那么简单。
在NSCell中跟踪鼠标,子类NSCell并覆盖
-[NSCell startTrackingAt:inView:]
和
-[NSCell stopTracking:at:inView:mouseIsUp:]
一旦检测到鼠标在单元格内进行跟踪,您就可以找到表格中包含[tableView rowAtPoint:point
]和[tableView columnAtPoint:point]
的单元格,然后找到{{1 }}
然后,您可以通过更改单元格的某些属性或通过覆盖[tableView frameOfCellAtColumn:column row:row]
来更改直接绘制单元格的方式来更改单元格的绘制方式。
这是关于子类化NSCell的文档: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ControlCell/Tasks/SubclassingNSCell.html
答案 2 :(得分:0)
通过在我的NSTableView子类中使用addGlobalMonitorForEventsMatchingMask: handler:
NSEvent
NSMouseMovedMask
,我实现了类似的功能。使用此功能以及NSTableView的columnAtPoint
和rowAtPoint
,我能够确定鼠标的位置是否在给定的单元格内。
使用此信息,当鼠标悬停在特定单元格上时,我能够调出PopOver。