我在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!
}
});
}
}
答案 0 :(得分:0)
等待!没说什么!经过深思熟虑之后,我再次弄明白了......我不应该检查表格视图的界限,而不是它的超级视图NSClipView
!完全有道理,但可能不会立即明显。这解决了这个问题。