检查是否在NSTableView中单击了鼠标



我在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!完全有意义,但可能不会立即显现出来。这解决了问题。

相关内容

  • 没有找到相关文章

最新更新