【问题标题】:PKToolPicker color picker dark mode on iOS 14iOS 14 上的 PKToolPicker 颜色选择器暗模式
【发布时间】:2021-04-05 12:43:11
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

    标签: swift uikit ios14 pencilkit


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      toolpicker.colorUserInterfaceStyle = UIUserInterfaceStyleLight;
      

      【讨论】:

      • colorUserInterfaceStyle 属性的作用是覆盖颜色选择器的调色板(例如黑色在浅色模式下为黑色,而在深色模式下为白色),而不是选择器本身的样式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2021-09-18
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多