如何在 Swift OS X 应用程序中更改 NSWindow 的标题颜色?
How can I change NSWindow's title color in Swift OS X app?
我已经尝试了很多东西,但没有任何效果...而且 NSWindow 不接受 NSAttributedString 的。如何更改 window 标题的颜色?
这是 Swift 中的解决方案。已经很晚了,我很累,所以这可能不是最佳选择,但它确实有效。
首先,这是一个在层次结构中查找视图的函数,可以选择跳过特定视图。 (如果我们要搜索 window.contentView.superview.subviews
并且我们想在 contentView
中忽略您自己的观点,这很有用)
func findViewInSubview(subviews: [NSView], #ignoreView: NSView, test: (NSView) -> Bool) -> NSView? {
for v in subviews {
if test(v) {
return v
} else if v != ignoreView {
if let found = findViewInSubview(v.subviews as [NSView], ignoreView: ignoreView, test) {
return found
}
}
}
return nil
}
下面是您将如何使用它,例如从 NSViewController
子类。请注意,您需要在 window 变得可见时执行此操作,因此您不能在 viewDidLoad
.
中执行此操作
override func viewDidAppear() {
if let windowContentView = view.window?.contentView as? NSView {
if let windowContentSuperView = windowContentView.superview {
let titleView = findViewInSubview(windowContentSuperView.subviews as [NSView], ignoreView: windowContentView) { (view) -> Bool in
// We find the title by looking for an NSTextField. You may
// want to make this test more strict and for example also
// check for the title string value to be sure.
return view is NSTextField
}
if let titleView = titleView as? NSTextField {
titleView.attributedStringValue = NSAttributedString(string: "Hello", attributes: [NSForegroundColorAttributeName: NSColor.redColor()])
}
}
}
}
请注意,您是在玩火。由于某种原因,像这样的内部结构未指定。
我已经尝试了很多东西,但没有任何效果...而且 NSWindow 不接受 NSAttributedString 的。如何更改 window 标题的颜色?
这是 Swift 中的解决方案。已经很晚了,我很累,所以这可能不是最佳选择,但它确实有效。
首先,这是一个在层次结构中查找视图的函数,可以选择跳过特定视图。 (如果我们要搜索 window.contentView.superview.subviews
并且我们想在 contentView
中忽略您自己的观点,这很有用)
func findViewInSubview(subviews: [NSView], #ignoreView: NSView, test: (NSView) -> Bool) -> NSView? {
for v in subviews {
if test(v) {
return v
} else if v != ignoreView {
if let found = findViewInSubview(v.subviews as [NSView], ignoreView: ignoreView, test) {
return found
}
}
}
return nil
}
下面是您将如何使用它,例如从 NSViewController
子类。请注意,您需要在 window 变得可见时执行此操作,因此您不能在 viewDidLoad
.
override func viewDidAppear() {
if let windowContentView = view.window?.contentView as? NSView {
if let windowContentSuperView = windowContentView.superview {
let titleView = findViewInSubview(windowContentSuperView.subviews as [NSView], ignoreView: windowContentView) { (view) -> Bool in
// We find the title by looking for an NSTextField. You may
// want to make this test more strict and for example also
// check for the title string value to be sure.
return view is NSTextField
}
if let titleView = titleView as? NSTextField {
titleView.attributedStringValue = NSAttributedString(string: "Hello", attributes: [NSForegroundColorAttributeName: NSColor.redColor()])
}
}
}
}
请注意,您是在玩火。由于某种原因,像这样的内部结构未指定。