はじめに
SwiftUI旅企画、いよいよ最終日です。4日目に作りかけてたアプリが完成しました!
が、Gitリポジトリを用意してさぁコミットだ!ってところで突然macがクラッシュして、そのタイミングが非常に悪かったのか、今まで開発したソースが全消失しました。
初回macをまっさらに初期化してから始めたので、gitのインストールを後回しにしてましたが、最初にやっておくべきでした。
一応、Qiitaで下書きしながらやってたので、以下の画像だけ残っていました。
開発中の様子
途中のXcodeスクショ

写真が一覧で出る様子

写真をタップすると全画面表示

ページ送りも可能

技術的には、以下2つのライブラリを使いました。
今回新たに挑戦したのは、画像をタップした時のフルスクリーン表示です。
画像をタップした際のフルスクリーン表示のやり方
コードが消えたので記憶頼りですが、
-
FullScreenというクラスを作り、その中に@PublishedをつけてisEnableみたいなBool変数を作る -
ContentViewとFullScreenViewの中で、@EnvironmentObjectをつけてFullScreenのインスタンスを定義する -
SceneDelegateからContentViewに対してFullScreenを初期化する -
ContentViewの中で、ZStackでConcentricOnboardingView(ページ送りできるView)とFullScreenView(画像1枚表示するView)の2つを重ねる。その際FullScreenViewは、if fullScreen.isEnable { FullScreenView() }みたいにして、isEnableがtrueの場合のみ表示させる - 画像のタップはImageの
onTapGesture {}で検知し、isEnableのtrue/falseをtoggle()で切り替える
ということをして実現しました。
[NOTE]
ZStackは子のビューを奥方向(Z座標方向)に重ねる
@Publishedは値が変化した時にbodyを再描画させるためのプロパティラッパー
@EnvironmentObjectは複数のView間でインスタンスを共有するためのプロパティラッパー
文章で説明しても非常にわかりづらいと思うので、参考になりそうなGitHubのオープンソースを探してみたら、こちらが似たことをしてました。
最後に
今回は5日間に渡ってSwiftUIの開発をするのが目的だったので、その点は達成できてよかったと思います。
ですが、残念だったのは2つです。
1つは、コードを貼り付けられないこと。
もう1つは、最終日の旅グルメはヨーロッパ旅行の本場パスタです!って完成したアプリをドンと出すという伏線回収計画が未遂に終わったことです。
その辺の勿体なさ、記事の薄さは感じるので、かわりに十数年前の思い出話をします。
当時、僕は中学生でしたが、RPGツクールでゲームを何個か作っていました。
そのうちの1つ、Princeという作品がありました。面白いもんじゃないのでリンクは貼りませんが。ニコ動に動画がある?たぶんそれです。黒歴史?僕の人生でそんなものは1つもありませんよ。
人間界とエルフ界を行き来するというなかなか壮大なシナリオで、プレステのメモリーカードを2枚以上消費する規模でした。
無事最終章まで作り終え、エンディングのスタッフロール制作中、突然データが壊れて開けなくなりました。

実はこれ以外にも2回、制作中のゲームデータが消し飛んだことがありました。
毎回、数十時間〜数百時間を無駄にしたと、荒れ狂っていました。
ようやく1作品完成して、オンライン配信できたのは2年後のことでした。
で、言いたかったのは機械を使う作業は最後の最後まで何があるかわからないということです。
大長編が一瞬で消えた経験をしたことない人も多いかもしれませんが、悪魔は油断を嗅ぎつけて這い寄ってきます。
特に最終盤の気が緩んでる時は、理屈では説明できないことも起きます。今回もまさにそのパターンです。帰るまでが遠足だったということですね。
今回SwiftUIで作ったものはほんの数日間お遊び程度の規模なので、正直消えてもよかったし、4回目としてカウントするほどの話ではありませんが、忘れかけてた青春時代の教訓を思い出させてくれました。
開発に集中しすぎず、毎日コミットする習慣をつけようと身を引き締めました。