【问题标题】:Determine if child window was moved by user or because parent window moved?确定是用户移动了子窗口还是因为父窗口移动了?
【发布时间】:2012-05-06 16:26:28
【问题描述】:

如何确定子窗口是否由用户直接移动,而不是由于其父窗口被移动?

在这两种情况下我都会收到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];
    }
}

【问题讨论】:

    标签: objective-c macos cocoa nswindow


    【解决方案1】:

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

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

    【讨论】:

    • 这很有趣。你能解释一下为什么“关键”状态在这里很重要吗?
    • 没关系;我觉得我懂了。我会在早上试一试,让你知道我的进展;如果可行,这是一个更好的解决方案,需要少一个 ivar 和一个委托方法。
    • 我编辑了我的答案以更完整,所以测试 isKey 的原因其他人都会清楚。
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多