Open50

SwiftのChartはいい感じだと思いきやハマるポイントたくさん

satomilkysatomilky

特に新しいAPIは気をつけた方がいい。めっちゃ不完全だから。

Xで共有してる。

satomilkysatomilky

ひょっとして、グラフ領域の上マージンをしっかり作れば良いのでは??
と思ったけど、ダメだ。それだと、Xaxisとかぶるやん。。

satomilkysatomilky

ダメだった、演算処理が重すぎるのエラーが出た。ええええええー。

これは、UIを調整するしかない。

satomilkysatomilky

あとカスタム実装だとこの辺りも参考にメモっておく(いつも探す)
https://nilcoalescing.com/blog/ChartAnnotationsOnHover/

これもAnnotionを使ってるんだけど、表示位置が単純なoverlayじゃなくて上手にコントロールしてる。
グラフ上に値を重ねなきゃいけないことは確定したので、選択日付の上に表示されないように調整したい。

satomilkysatomilky

なるほど、上の実装をしたために、横スクロールが効かなくなった。ほんと難しいな。

satomilkysatomilky

やはり1年分の横長スクロールを諦めるか。
ヘルスケアと同じく、Monthlyで切るか。

satomilkysatomilky

線があると、ついついそこそこ横幅を取りたくなってしまうから、そこをなんとかするか。

satomilkysatomilky

chartScrollableAxes(.horizontal) を使わない実装にすることで、ようやくできたよ。

寝る。

satomilkysatomilky

でも、日付が間違ってんな。なんだこれ。明日確認するぞ。

satomilkysatomilky

それか、もう、スワイプで前後のViewの移動を諦めるか。。だな。

satomilkysatomilky

で、で、できたぁぁ!!!!!!
onChangeを使えばよかったんだ。

(無意味に四苦八苦したソースはコメント化して残して、git pushしておこ。)

https://youtu.be/KJW-oQ_qBTg

satomilkysatomilky

あとは、タブ移動した瞬間に、前のViewのselectedはnilにするってやらないとな。。

いや、UX的には残ってた方がいいのかな。どっちだ?
でも、タブ切り替えしてるのに、前後のViewに残ってるの気持ち悪くない?
と思いつつ、比較したいとかあったりする?ええええ。むずいな。

まぁ、期待するのとしては、前後のViewに残ってるのが変かな。って気がするからTab移動したタイミングで、リセットさせるようにするか。

satomilkysatomilky

骨子となる動きはできたから、あとは、細かいデザインのチューニングだけや。
長かったけど、なんとか1月中に終わらせることできそう。(ってあと2日しかないから無理だった)
正月の休みの時にちゃんと着手していればなぁ。

残タスクは

  • ヘッダー要素の最適化
    • グラフに表示させているサイクルの表示
  • Detailのチップのデザイン
  • グラフのグリッドチューニング
  • 高温期をわかりやすく表現

課金ユーザー対応

  • 体重グラフの表示切り替え
  • グラフの期間をMonthlyかCycleかで切り替え。

ってくらいかな。
と、実装をめちゃめちゃ先行させて、ようやくFigmaの出番である。

がんばろ。

satomilkysatomilky

annotionのコンテンツにはButtonは配置できない。。と

satomilkysatomilky

こんな普通にクリックできそうなのに、できない!!!!
AnnotionのcontentsにButton配置してもアクションが起こらない!終わり!

satomilkysatomilky

うわああ、やっぱりこれやんなきゃダメかな。。

satomilkysatomilky

さて、2.1.0にてチャート機能を搭載してから、若干放置だったチャート機能ですが、サイクル予測の表示を最適化したことによって、チャート上にも排卵予定日などを記載できそうな気配がしてきました。

ということで、ここからはその作業ログになります。

satomilkysatomilky

Ruleマークってこうやってまとめて記載できるんだな。ふむ。

satomilkysatomilky

あら意外と簡単に入った(OvulationDateはマジックナンバー状態だけど)

satomilkysatomilky

こんな感じかしら。若干色がガチャガチャして見づらいんだけど。

デザインの調整は後回しや。

次は変数にロジック組み込むぞ。ここからが意外と難しいのだよね。Chartに合わせたデータを用意するのが。

satomilkysatomilky

月別とサイクル別で区切られるようにこのような汎用的な構造体を作ってるんだけど、
プロパティに、IntervalTypeみたいなenumのプロパティをを持たせた方がいいかもしれんなぁ。

type = cycle と時だけ、働かせたいロジックとかあるのよな。

なぜならCycle区切りのViewが課金領域の対象でもあるからな。

satomilkysatomilky

というか、その方がロジック算出が楽なのである。。。

satomilkysatomilky

子供と色々遊んでたらこんな時間になってしまった。

type = cycleとかにすると、また予測値のロジック組まにゃいかんな。
プロパティにcycleデータ持たせるか。。そうしたら、cycleから引っ張ってこれるわ。
ChartIntervalにCycleを直接持たせようとしたら、
Decordableに対応せよ。って言われて。えーとなったので別の方法を採用。

なんとかできた。

あとは、

  • 妊娠期間のように長期サイクルになったときは表示させない。
  • 現サイクル
    • 予定終了日を起点に予測値も算出
    • 遅くなってる時に予測値もずらす
    • 完全に入力しなくなった場合の対処
      とかをやらにゃいかん。
satomilkysatomilky

でも、そろそろ寝る時間なので実機にDevインストールして、一旦寝る。

satomilkysatomilky

おはよう。10時に家を出なければならないので、あと、40分で上の作業を終わらせる。

satomilkysatomilky

結局終わらず、現サイクルの時の諸々の処理だけ残して、出かけたけれど、戻ってきたので作業再開。
が、修正の方向性はもう見えてるのであと少し。

satomilkysatomilky

できたんだけど、OvulationDateがX軸から少しズレてる。

satomilkysatomilky
.value("startDate", startDate, unit: .day),

とunit を設定すればほらね。