在Light模式下获取PKDrawing的图像

Get Image of PKDrawing in Light mode

我希望我的 UI 支持深色模式,但不支持我的 PKCanvasView。我用了

myCanvasView.overrideUserInterfaceStyle = .light

所以黑暗模式不适用于它并且它有效:黑线保持黑色,白线保持白色,而其余部分 UI 响应系统设置。

但是,当我尝试像这样捕捉 PKDrawing 的图像时:

myCanvasView.drawing.image(from: myCanvasView.bounds, scale: CGFloat(1.0))

启用深色模式时,图像上的白线变为黑色,黑线变为白色。我在我所有的 ViewController 上将 overrideUserInterfaceStyle 设置为 .light,但是绘图的图像仍然受到系统设置的影响。只有在覆盖 info.plist 文件中的用户界面阶梯时,PKDrawing 的图像才会保持我想要的样子,即使我将所有 ViewController 上的 overrideUserInterfaceStyle 设置为 .dark

有没有办法在不覆盖 info.plist 文件的情况下从 PKDrawing 获取 "light mode" 图像,从而失去响应系统设置的可能性?在我看来,PKDrawing 的 image() 函数似乎只是检查为应用程序设置的用户界面样式,而不是为任何 ViewController 设置的。由于 PKDrawing 是一个不透明的对象,覆盖该方法将不起作用。

编辑:我的想法是覆盖 info.plist 中应用程序的界面样式,然后检查系统设置并根据设置为所有 ViewController 设置界面样式。这将使绘图的图像像它们应该的那样正常,但保持对系统设置的响应。但是,我没有找到任何关于如何检查系统设置中是否启用深色模式的信息。

我不确定我是怎么想出来的,但解决方案很简单。像这样生成图像:

self.traitCollection.performAsCurrent {
    drawingImage = myCanvasView.drawing.image(from: myCanvasView.bounds, scale: CGFloat(1.0))
}

忽略系统深色模式设置,保持绘图原样

这是另一种解决方案。如果您需要同步图像更好。

import PencilKit

extension PKDrawing {
  
  func image(from rect: CGRect, scale: CGFloat, userInterfaceStyle: UIUserInterfaceStyle) -> UIImage {
    let currentTraits = UITraitCollection.current
    UITraitCollection.current = UITraitCollection(userInterfaceStyle: userInterfaceStyle)
    let image = self.image(from: rect, scale: scale)
    UITraitCollection.current = currentTraits
    return image
  }
}