I have some mouse click-checking code in a NSTableView
subclass that can intercept and modify mouse events to allow for clicking of buttons inside the table but the problem is that these events are also intercepted if the mouse is clicked anywhere else, not just on the table. My question therefore: How can I check if NSPoint.locationInWindow
is within ONLY the table's visible bounds?
My code below lets the event through even if clicked somewhere where a table row is scrolled beyond the visible table area.
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!
}
});
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…