我想自定义我在OS X上绘制窗口 Headers 栏的方式 . 具体来说,我想做一些像Twitterrific应用程序,其中有自定义关闭按钮,没有最小/最大按钮,以及窗口 Headers 文本是对的 . 与Twitterrific不同,我不打算自定义绘制整个窗口(尽管我并不完全反对) .
我已经看过Cocoa With Love上的RoundWindow示例以及Apple提供的RoundTransparentWindow示例,但似乎都不合适 .
如果您不想使用无边界窗口类,那么您可以做一些事情 .
首先,您可以使用 -[NSWindow standardWindowButton:] 自定义关闭/最小/最大按钮 . 一旦你得到按钮,你可以定位/删除/等...
-[NSWindow standardWindowButton:]
您可以通过将 Headers 设置为 @"" 来自定义 Headers . 然后你可以通过执行以下 [[[NSWindow contentView] superview] addSubview:textField] 添加 NSTextField 来绘制自己的 Headers .
@""
[[[NSWindow contentView] superview] addSubview:textField]
NSTextField
这可能是最简单的做事方式 .
另一种方法是自定义绘制所有窗口 Headers 栏的视图等...
NSWindow的内容视图位于“主题视图”中 . 您可以继承主题视图并执行自己的绘图 . 唯一的问题是主题视图是一个私人类,所以你必须要小心 .
cocoadev提供了有关如何最好地实现自己的 NSWindow 子类的更多细节,并附有对大多数常见陷阱的描述 .
NSWindow
它的要点是创建 NSWindow 的子类,并在init方法中将其 styleMask 设置为 NSBorderlessWindowMask :
styleMask
NSBorderlessWindowMask
- (id) initWithContentRect: (NSRect) contentRect styleMask: (unsigned int) aStyle backing: (NSBackingStoreType) bufferingType defer: (BOOL) flag { if ((self = [super initWithContentRect: contentRect styleMask: NSBorderlessWindowMask backing: bufferingType defer: flag]) == nil) { return nil; } [super setMovableByWindowBackground:YES]; [super setLevel:NSNormalWindowLevel]; [super setHasShadow:YES]; // etc. return self; }
请注意,您应该为 canbecomeKeyWindow 返回YES,以使窗口像普通窗口一样运行 .
canbecomeKeyWindow
- (BOOL) canBecomeKeyWindow { return YES; }
然后,您可以创建自定义NSView子类,使用所述类的实例填充整个窗口,然后在该自定义视图中执行所有相应的窗口绘制 .
整件事情可能会有点痛苦 . 您将不得不重新实现大多数常规窗口行为,例如通过拖动右下角来调整大小 .
CoreData Stickies示例项目中有一个自定义窗口实现的示例 .
3 回答
如果您不想使用无边界窗口类,那么您可以做一些事情 .
首先,您可以使用
-[NSWindow standardWindowButton:]
自定义关闭/最小/最大按钮 . 一旦你得到按钮,你可以定位/删除/等...您可以通过将 Headers 设置为
@""
来自定义 Headers . 然后你可以通过执行以下[[[NSWindow contentView] superview] addSubview:textField]
添加NSTextField
来绘制自己的 Headers .这可能是最简单的做事方式 .
另一种方法是自定义绘制所有窗口 Headers 栏的视图等...
NSWindow的内容视图位于“主题视图”中 . 您可以继承主题视图并执行自己的绘图 . 唯一的问题是主题视图是一个私人类,所以你必须要小心 .
cocoadev提供了有关如何最好地实现自己的
NSWindow
子类的更多细节,并附有对大多数常见陷阱的描述 .它的要点是创建
NSWindow
的子类,并在init方法中将其styleMask
设置为NSBorderlessWindowMask
:请注意,您应该为
canbecomeKeyWindow
返回YES,以使窗口像普通窗口一样运行 .然后,您可以创建自定义NSView子类,使用所述类的实例填充整个窗口,然后在该自定义视图中执行所有相应的窗口绘制 .
整件事情可能会有点痛苦 . 您将不得不重新实现大多数常规窗口行为,例如通过拖动右下角来调整大小 .
CoreData Stickies示例项目中有一个自定义窗口实现的示例 .