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