8

当我将进度指示器的背景设置为绿色时,它按预期工作。

代码

loadingIndicator.wantsLayer = true
loadingIndicator.layer?.backgroundColor = NSColor.greenColor().CGColor

结果

在此处输入图像描述

但是当我将背景颜色设置为白色时,背景颜色保持灰色(而不是变为白色)。

代码

loadingIndicator.wantsLayer = true
loadingIndicator.layer?.backgroundColor = NSColor.whiteColor().CGColor

结果

在此处输入图像描述

为什么将背景颜色设置为白色不起作用,而将绿色设置为?我该如何纠正这个问题?我在 OS X 10.11.4 上。

编辑:这显然只发生在进度指示器位于显示为弹出框的视图内时。

4

4 回答 4

5

当我在 NSPopover 中使用 NSProgressIndicator 时,我遇到了同样的问题。

我的解决方案是将外观设置为弹出窗口,如下所示。

popover.appearance = NSAppearance(named: NSAppearanceNameAqua)
  • 在 OSX 10.11.5 / Xcode7.3.1 上试过
  • 除了 NSAppearanceNameVibrantDark 之外的任何其他名称也有效

我不确定为什么会发生这种情况,但是在设置属性后,我得到了正确的白色背景颜色。

截图:弹出框内的白色背景进度

于 2016-11-16T15:50:15.030 回答
4

我找到了解决这个问题的方法。NSProgressIndicator 的 CALayer 有一个子图层,显示您看到的有色背景颜色。隐藏该子图层将导致不会显示任何背景,并保持微调器可见。

CALayer *layer = [[self popoverProgressIndicator] layer];
CALayer *backgroundLayer = [[layer sublayers] firstObject];
[backgroundLayer setHidden:YES];

我只在 NSPopover 内部使用此解决方案更改背景时才看到此问题

于 2016-10-21T23:26:54.773 回答
2

我最近也遇到过这个问题,但我的问题与 macOS 10.14 中的暗模式/亮模式有关。正如其他人所提到的,在 NSPopover 中使用 NSProgressIndicator 时似乎会发生这种情况,但在 Safari 应用程序扩展弹出框内也是如此(我认为这是因为 Safari 弹出框也是您无法直接访问的 NSPopover)。正如horimislime所说,搞乱外观似乎可以解决问题。

我创建了一个 NSProgressIndicator 子类,只有当应用程序在 macOS 10.14 或更高版本中运行时,它才会自动将自己的外观设置为系统所拥有的外观,即使在应用程序运行时它会发生变化。进度指示器在以前的操作系统版本中适用于我,因此如果系统低于 10.14,我将其保持不变。

这是代码:

import Cocoa

class TransparentProgressIndicator: NSProgressIndicator {

    override func awakeFromNib() {
        super.awakeFromNib()

        if #available(OSX 10.14, *) {
            // register an observer to detect when the system appearance changes
            UserDefaults.standard.addObserver(self, forKeyPath: "AppleInterfaceStyle", options: .new, context: nil)

            // set the starting appearance to the one the system has
            let light = NSAppearance(named: .aqua)
            let dark = NSAppearance(named: .darkAqua)
            self.appearance = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" ? dark : light
        }
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        if #available(OSX 10.14, *) {
            if keyPath == "AppleInterfaceStyle" {

                // set the current appearance to the one the system has
                let val: String? = change?[NSKeyValueChangeKey.newKey] as? String

                if (val == "Dark") {
                    self.appearance = NSAppearance(named: .darkAqua)
                }
                else {
                    self.appearance = NSAppearance(named: .aqua)
                }
            }
        }
    }

    deinit {
        if #available(OSX 10.14, *) {
            UserDefaults.standard.removeObserver(self, forKeyPath: "AppleInterfaceStyle")
        }
    }

}

这样,进度指示器保持透明,没有奇怪的着色背景,并且仍然根据系统外观更改其配色方案。为了使用它,您需要将此子类的名称添加为界面构建器中的“自定义类”属性:

自定义类示例

现在,为了获得问题中要求的自定义背景颜色,您可以只拥有一个包含 NSBox 并为其添加颜色:

自定义 NSBox 属性 ProgressIndicator 约束

于 2019-10-23T13:48:56.407 回答
1

当我使用NSProgressIndicatorinside时,我遇到了同样的问题NSPopover

我的解决方案是将外观设置为NSProgressIndicator如下所示。

@IBOutlet weak var progressIndicator: NSProgressIndicator!

override func viewDidLoad() {
    super.viewDidLoad()
    self.progressIndicator.appearance = NSAppearance(named: .aqua)
}

如果您愿意,甚至可以将外观设置为整个弹出框,也可以解决问题:

popover.appearance = NSAppearance(named: .aqua)
于 2020-01-28T12:59:38.477 回答