在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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)