Mac OS 让NSWindow移动到另一个屏幕并始终保持在活动space窗口前

最近一个Mac项目要做到用户共享桌面UI需要在桌面最前端展示一个蓝色的边框,需要做到用户分享哪个显示器蓝框到哪个显示屏上边,踩了一点雷,所以记录下来。

结果如下图Mac OS 让NSWindow移动到另一个屏幕并始终保持在活动space窗口前_第1张图片

因为我接了一个显示器所以 我直接写死了获取ID

Mac OS 让NSWindow移动到另一个屏幕并始终保持在活动space窗口前_第2张图片

点击按钮1分享第一个屏幕 点击按钮2分享第二个屏幕

localControl.window 的window等级需要设置一下(子类化一个NSWindow)

[self setLevel:NSScreenSaverWindowLevel];
        
self.animationBehavior = NSWindowAnimationBehaviorNone;
        
self.collectionBehavior = NSWindowCollectionBehaviorMoveToActiveSpace;

现在已经可以分享到指定的桌面了,但是在滑动的时候会发现,蓝框只保持在屏幕的第一个桌面,假如屏幕有多个桌面则会出现滑动到另一个屏幕的时候蓝框消失。

这样是有问题的,我们应该添加如下代码

//workspace改变时通知
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(changeActiveSpace:) name:NSWorkspaceActiveSpaceDidChangeNotification object:nil];

- (void)changeActiveSpace:(NSNotification *)sender
{
    [localControl.window close];
    [localControl.window makeKeyAndOrderFront:nil];
}

这样就实现了蓝框始终在workspace窗口之上。

你可能感兴趣的:(Mac,OS)