自定义NSWindow的Title View

自定义NSWindow的Title View,第1张

概述在Mac中自定义NSWindow的标题栏其实很简单,在OS X 10.10之前,我们可以通过简单的两行代码来搞定: NSView *themeView = [window.contentView superview];[themeView addSubview:self.viewCustom positioned:NSWindowBelow relativeTo:nil]; 但是在Yosemit

在Mac中自定义NSWindow的标题栏其实很简单,在OS X 10.10之前,我们可以通过简单的两行代码来搞定:

NSVIEw *themeVIEw = [window.contentVIEw supervIEw];[themeVIEw addSubvIEw:self.vIEwCustom positioned:NSWindowBelow relativeTo:nil];

但是在Yosemite以后,运行以上代码,会得到一段警告:

NSWindow warning: adding an unkNown subvIEw: <NSVIEw: 0x608000120fa0>. Break on NSLog to deBUG.

虽然目前并不会影响程序的执行,但是对于有点洁癖的人来说,看到这段警告还是很不爽的,那么在Yosemite我们要怎么避免这个错误而实现我们的目的呢?

根据警告内容,我们知道themeVIEw不能添加未知的vIEw,通过themeVIEw的subvIEws,可以知道它包含了两个vIEw,一个就是window的contentVIEw,而另外一个是NSTitlebarContainerVIEw,这个vIEw就是window的标题栏,可以看到他的高度刚好是22。那我们要自定义TitleVIEw,就要通过NSTitlebarContainerVIEw来做文章了,但是这个vIEw只局限在NSWindow标题栏那小小22高度的地方,怎么让他铺满整个window呢,可以通过NSTitlebaraccessoryVIEwController来解决。

NSTitlebaraccessoryVIEwController *vc = [[NSTitlebaraccessoryVIEwController alloc] init];vc.vIEw = [[NSVIEw alloc] initWithFrame:((NSVIEw *)window.contentVIEw).frame];[window addTitlebaraccessoryVIEwController:vc];NSVIEw *containerVIEw = themeVIEw.subvIEws[1];[containerVIEw addSubvIEw:self.vIEwCustom positioned:NSWindowBelow relativeTo:nil];

新建一个NSTitlebaraccessoryVIEwController,填充一个大小和contentVIEw刚好的vIEw,然后通过window的addTitlebaraccessoryVIEwController方法添加到window中。这时候我们再去看themeVIEw下的两个子vIEw,发现contentVIEw的高度变成0,而NSTitlebarContainerVIEw的高度变成了window的高度了,这样我们的目的就达到了,接着我们把自定义的vIEw添加到TitleVIEw中,但是发现我们自定义的vIEw是半透明的样子,这时候只要把window的Titlebarappearstransparent设置为YES就可以了。

下面是一段兼容新旧版本的代码

NSWindow *window = self.window;[window center];window.movableByWindowBackground = YES;window.TitleVisibility = NSWindowTitleHIDden;window.Titlebarappearstransparent = YES;NSVIEw *themeVIEw = [window.contentVIEw supervIEw];if (NSAppKitVersionNumber <= NSAppKitVersionNumber10_9) {    [themeVIEw addSubvIEw:self.vIEwCustom positioned:NSWindowBelow relativeTo:nil];} else {    NSTitlebaraccessoryVIEwController *vc = [[NSTitlebaraccessoryVIEwController alloc] init];    vc.vIEw = [[NSVIEw alloc] initWithFrame:((NSVIEw *)window.contentVIEw).frame];    [window addTitlebaraccessoryVIEwController:vc];    NSVIEw *containerVIEw = themeVIEw.subvIEws[1];    [containerVIEw addSubvIEw:self.vIEwCustom positioned:NSWindowBelow relativeTo:nil];}

这是我写的一个Demo,源码放到Github上了。

总结

以上是内存溢出为你收集整理的自定义NSWindow的Title View全部内容,希望文章能够帮你解决自定义NSWindow的Title View所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存