我在NSTableView
子类中有一些鼠标单击检查代码,可以拦截和修改鼠标事件以允许单击表内的按钮,但问题是,如果单击鼠标,而不仅仅是在桌子上,这些事件也会被拦截。因此,我的问题:如何检查NSPoint.locationInWindow
是否仅在表的可见范围内?
我下面的代码可以让事件通过,即使单击表格行滚动到可见表格区域之外的某个地方。
class ButtonTableView : NSTableView
{
var isAtForeground:Bool = false;
override init(frame frameRect:NSRect) {
super.init(frame: frameRect);
}
required init?(coder:NSCoder) {
super.init(coder: coder);
addEventInterception();
}
func addEventInterception() {
NSEvent.addLocalMonitorForEventsMatchingMask(.LeftMouseDownMask, handler: {
(theEvent) -> NSEvent! in
/* Don't bother if the table view is not in the foreground! */
if (!self.isAtForeground) { return theEvent; }
var e:NSEvent? = theEvent;
let p:NSPoint = theEvent.locationInWindow;
// Check for click within table bounds
let tableBoundsInWindowCoords:NSRect = self.convertRect(self.bounds, toView: nil);
if (CGRectContainsPoint(tableBoundsInWindowCoords, p))
{
// This gets through even if clicked on table rows that are scrolled-out and not within the table's visible area!
}
});
}
}
等等!什么都不说!经过深思熟虑,我再次想通了......我不应该检查表视图的边界,而是检查其超级视图的边界,NSClipView
!完全有意义,但可能不会立即显现出来。这解决了问题。