【问题标题】:Textured NSWindow with setBackgroundColor has a tinged grey background带有 setBackgroundColor 的带纹理的 NSWindow 具有浅灰色背景
【发布时间】:2023-03-29 22:34:01
【问题描述】:

基本上我想做一个简单的关于窗口,它有一个统一的标题栏和窗口(即纹理)和白色背景,就像 Xcode 的关于窗口:

所以我在 IB 中有一个带纹理的窗口,并通过绑定将它连接到我的应用程序委托。然后我将这行代码添加到应用程序委托中:

[about setBackgroundColor:[NSColor whiteColor]];

虽然对于红色和蓝色等其他颜色,窗口似乎可以很好地改变颜色,但每当我使用 [NSColor whiteColor] 时,窗口看起来远没有 Xcode 的窗口那么明亮:

有趣的是,当窗口处于非活动状态时,我最终会得到 Xcode 的白色:

这是一个错误吗?或者它应该看起来真的是灰色的?我怎样才能使这个窗口“真正的白色”?

【问题讨论】:

  • 你试过[UIColor colorWithRed:0.0, green:0.0, blue: 0.0, alpha:1.0]
  • @trumpeter201 这只是让窗口变黑,你的意思是 [NSColor colorWithRed:1 green:1 blue:1 alpha:1]?无论如何它会产生相同的灰色结果
  • 我在 Xcode 5.1 中尝试过,在applicationDidFinishLaunching 中添加了[self.window setBackgroundColor:[NSColor whiteColor]];,我得到了一个白色纹理窗口。你在哪里设置背景颜色?
  • @GoodSp33d 我在同一个地方添加了它,但这是在 Xcode 6 中,所以如果它在以前的版本中运行良好,我认为它一定是一个错误
  • 是的,我做到了。对我来说这似乎是一个错误。

标签: objective-c xcode cocoa nswindow osx-yosemite


【解决方案1】:

你不需要一个 hacky 解决方案来解决这个问题(至少现在不需要了)。

创建一个视图控制器,然后以modal 的形式打开它。在视图控制器的子类代码中,添加:

class YourVC: NSViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    //Set the background color to white
    self.view.wantsLayer = true
    self.view.layer?.backgroundColor = NSColor.white
  }
  override func viewDidAppear() {
    //Customize the window's title bar
    let window = self.view.window

    window?.styleMask.insert(NSWindowStyleMask.unifiedTitleAndToolbar)
    window?.styleMask.insert(NSWindowStyleMask.fullSizeContentView)
    window?.styleMask.insert(NSWindowStyleMask.titled)
    window?.toolbar?.isVisible = false
    window?.titleVisibility = .hidden
    window?.titlebarAppearsTransparent = true
  }
}

这是在 Xcode 8 中使用 Swift 3。

【讨论】:

    【解决方案2】:

    我找到了一个教程,它使用了一个漂亮的 ghetto hack 来交换框架视图的 drawRect: 方法:http://parmanoir.com/Custom_NSThemeFrame

    它甚至不需要你继承 NSWindow,但我还是这样做了,以防我想在另一个窗口或其他东西上使用它。

    最终结果:

    编辑:我不久前提交了一份反馈助理报告,从 Yosemite DP 7 或 Xcode 6.1 开始,此问题似乎已得到修复。设置带纹理的窗口的背景颜色现在会产生一种不带色调的颜色。

    【讨论】:

    • 这看起来很不错。你知道这在 Mac App Store 中是否允许吗?
    • @AP。回想起来可能不是,但至少现在已经修复了,所以你不应该使用这种方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多