SurfTideXでウィジェットを実装したときのメモです。
ウィジェットはSurfTideΔでも実装したのですが、そのときはダークモードでもライトモードでも使えるカラーとデザインで逃げたのですが、今回はきっちり実装してみました。
そもそも、UIImage を使わなければ面倒なことをしなくても簡単にダークモードに対応できるのですが、タイドグラフは文字通りグラフなのでイメージなんです。
グラフをSwifuUIで書き換えるのも面倒なので(というかタイドグラフを画像化するのは既に実装があるしウォッチでも使うので)なんとかUIImageを使っての実装にしたかったのです。
問題は、ウィジェットは事前にタイムラインにそってデータを作り(そのデータからタイドグラフをUIImageにしている)表示するので、既に作成したイメージは途中で表示モードを変更しても既に遅しなのです。
で、色々ネットで調べたのですが、どストライクの解答はもちろん無くて、やっとみつけたのがstackoverflowのこれ
やりたいこととはズレてますがヒントにはなりました。
そうです、モードが切り替わるタイミングでUIImageを作り変えちゃえばいいだけでした…
方針がきまってしまえば、あとは実装だけ
ウィジェットのメイン部分に
// ウィジットメイン画面
struct TideWidgetEntryView : View {
@Environment(\.colorScheme) var colorScheme
を追加して
この colorScheme をUIImageを作成しているクラスに渡して、作画部分でUIColorを使っている部分を以下のように書き換えれば完了!
// タイド作画 func drawContents(_ ctx: CGContext) { let traitCollection = UITraitCollection(userInterfaceStyle: colorScheme == .dark ? .dark : .light) 省略... // MSL-潮位表基準面(cm) のラインを引く if let msl = gScale.msl { let mslYPos = calcYpos(gScale, centimeter: CGFloat(msl)) ctx.setLineWidth(0.6) ctx.setStrokeColor(UIColor.systemTeal.resolvedColor(with: traitCollection).cgColor) ctx.move(to: CGPoint(x: 0, y: mslYPos)) ctx.addLine(to: CGPoint(x: graphSize.width, y: mslYPos)) ctx.strokePath() } 省略...
Comments