确定子窗口是由用户移动还是因为父窗口移动了?

时间:2012-05-06 16:26:28

标签: objective-c macos cocoa nswindow

如何确定用户是否直接移动子窗口而不是移动父窗口?

我在两种情况下都收到了NSWindowDidMoveNotification次通知。

我想我可以在NSWindowWillMoveNotification处理程序中测试父帧原点,并在NSWindowDidMoveNotification处理程序中将其与原点进行比较,但是或许还有更好的方法吗?

这是我目前的解决方案:

- (void)windowWillMove:(NSNotification *)notification
{
    NSWindow *window = [notification object];
    _parentOrigin = [[window parentWindow] frame].origin;
}

- (void)windowDidMove:(NSNotification *)notification
{
    NSWindow *window = [notification object];
    NSPoint newParentOrigin = [[window parentWindow] frame].origin;
    if (_parentOrigin.x == newParentOrigin.x &&
        _parentOrigin.y == newParentOrigin.y)
    {
        // The parent hasn't moved, therefore the user moved the window directly...
        [window doThing];
    }
}

1 个答案:

答案 0 :(得分:4)

单击要移动的窗口将成为关键窗口,而子窗口如果因移动父窗口而移动则不会成为关键窗口。因此,如果您测试发送通知的窗口是否是关键窗口,您可以判断用户移动了哪个窗口。

- (void)windowDidMove:(NSNotification *)notification {
    NSWindow *movedWindow = notification.object;
    if ([movedWindow isKeyWindow]) {
        NSLog(@"%@",movedWindow);
        [movedWindow doThing];
    }
}