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

标签 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];
    }
}

最佳答案

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

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

关于objective-c - 确定子窗口是由用户移动还是因为父窗口移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472162/

相关文章:

iphone - 来自网页的响应没有改变 iPhone

objective-c - 将 NSDecimalNumber 转换为 NSString

bash - Vagrant 报告一个没有任何运行的端口冲突

objective-c - ObjC Date 始终返回 2017 年 12 月 25 日

xcode - IOS Swift 在自己的类中定义自己的应用程序设置

iphone - 如何在更改另一个 View Controller 中的值后要求第一个 View Controller 重新加载其 View ?

objective-c - 当应用程序被卸载时,我的 UIPasteboard 上的持久性仍然有效。为什么?

macos - 在Docker容器中使用setuid

objective-c - 如何更改 Xcode 应用程序的外观?

objective-c - 获取进程列表并隐藏特定应用程序