4

我有一个带有 PKCanvasView 的控制器,它连接到窗口共享 PKToolPicker。

我可以强制 PKToolPicker 具有深色外观(图 1):

if let window = self.parent?.view.window, let toolPicker = PKToolPicker.shared(for: window) {
    toolPicker.overrideUserInterfaceStyle = .dark
}

不幸的是,如果用户点击颜色选择器按钮,颜色选择器不会继承样式,并且选择器会以浅色样式显示(图 2)。

有谁知道如何强制 PKToolPicker 的颜色选择器在 iOS 14 上具有深色样式?

谢谢

在此处输入图像描述

4

2 回答 2

1

不是一件容易的事。除了更改整个系统范围的附加功能的界面样式之外,还没有找到这样做的好方法。大多数情况下,我在创建界面时将其设置为我想要的模式,并在它被关闭时将其设置回来。如果其他窥视者有更好的解决方案,我会全力以赴。

我的代码在 SwiftUI 中,所以你可能需要适应。我想要灯光模式在我身边,但那是等价的。

fileprivate static var currentWindowScene: UIWindowScene? {
    UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
}

// Make sur the color picker is not inverted
if let windows = Self.currentWindowScene?.windows {
    for window in windows {
        if window.windowLevel != .normal && window.windowLevel != .alert && window.windowLevel != .statusBar {
            if overriddenWindows[window] == nil {
                DispatchQueue.main.async {
                    overriddenWindows[window] = window.overrideUserInterfaceStyle
                }
            }
            window.overrideUserInterfaceStyle = .light
        }
    }
}

在其他地方(在 toolPicker 首次初始化时):

toolPicker.overrideUserInterfaceStyle = .light

当窗口关闭时:

.onDisappear {
    if let windows = Self.currentWindowScene?.windows {
        for window in windows {
            if let overridden = overriddenWindows[window] {
                window.overrideUserInterfaceStyle = overridden
            }
        }
        overriddenWindows = .init()
    }
}

绘制图像时:

var result: UIImage?
UITraitCollection(userInterfaceStyle: UIUserInterfaceStyle.light).performAsCurrent {
result = drawing.image(from: CGRect(x: 0, y: 0,
                                    width:zoneSize.width,
                                    height: zoneSize.height),
                       scale: UIScreen.main.scale)
}
return result
于 2021-03-07T19:28:05.760 回答
0

虽然更改 window.overrideUserInterfaceStyle 有效,但有一个更简单的解决方案:将颜色选择器的 colorUserInterfaceStyle 设置为浅色:(Obj-C)

toolpicker.colorUserInterfaceStyle = UIUserInterfaceStyleLight;
于 2021-10-13T08:27:57.307 回答