Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 跟随带有窗口的NSStatusItem-切换到更高显示屏时位置不正确_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 跟随带有窗口的NSStatusItem-切换到更高显示屏时位置不正确

Objective c 跟随带有窗口的NSStatusItem-切换到更高显示屏时位置不正确,objective-c,macos,cocoa,Objective C,Macos,Cocoa,问题是:我必须跟随应用程序的NSStatusItem弹出窗口/窗口 对此的一般解决方案(如建议的或)是向NSStatusItem添加自定义视图,并获取视图的窗口框架(statusItem.view.window.frame),然后通过NSWindowDidMoveNotification通知statusItem.view.window连接到移动事件 除非用户连接的外部显示器比以前的显示器高(例如Mac Book用户连接的外部显示器),否则此解决方案的工作效率为99%。在这种情况下,statusI

问题是:我必须跟随应用程序的NSStatusItem弹出窗口/窗口

对此的一般解决方案(如建议的或)是向NSStatusItem添加自定义视图,并获取视图的窗口框架(statusItem.view.window.frame),然后通过NSWindowDidMoveNotification通知statusItem.view.window连接到移动事件

除非用户连接的外部显示器比以前的显示器高(例如Mac Book用户连接的外部显示器),否则此解决方案的工作效率为99%。在这种情况下,statusItem.view.window.frame将不正确,X坐标将实际正确,但Y坐标将与较小屏幕中的相同

我已经检查过了,大多数菜单栏应用程序在你点击状态项时会弹出一个窗口,但正如我所描述的那样,它们都放错了位置

我的解决方案是不使用此帧的Y坐标,而是使用相应NSScreen的visibleFrame高度,如下所示:

NSScreen *screenWithMenuBar = [[NSScreen screens] objectAtIndex:0];
    if( screenWithMenuBar ) {
        // correct the top position by the 'screen with the MenuBar's height
        //  workaround: without this the window will be off-placed when the user plugs in an external display,
        //      a display with more height
        NSRect visibleRect = [screenWithMenuBar visibleFrame];
        originPoint.y = visibleRect.size.height + visibleRect.origin.y;
    }
正如苹果官方文档中所述,它应该可以工作,但对我来说,这似乎太难了


你们有没有经历过这种错误?您找到更好的解决方案了吗?

获取
[[NSStatusBar systemStatusBar]thickness]
的新值有效吗?@KeithSmiley它总是一样的(切换到外部显示器时菜单栏的厚度不会改变)-抱歉,也许我不明白您的建议-这应该有什么帮助?