SwiftUIの勉強
SwiftUI Tutorials
公式のチュートリアルをやってみる。
Creating and Combining Views
とりあえずデフォルトのプロジェクトで実行するとエラーになる。signingとやらが必要?
それはそれとしてCanvasでのPreviewはできた。
Swift UI InspectorはPreviewだけでなくソースコードでCommand+Clickしても起動できる!単にレンダリングしてるのではないのだな。
GUIでレイアウトしていくのは無駄コードが出そうで拒否感があったが、少なくともシンプルなレイアウトでは簡潔に表現してくれる。
画像や地図などコンポーネントごとにViewをつくっていくのが流儀なのか。一画面に対してたくさんViewできるのはややこしくないか?
secondaryカラーってなんだ?どういう基準で使う色なのかわからない。
Building Lists and Navigation
Create a Landmark Model
landmarkData.jsonにあるisFeaturedとかはLandMark.swiftに記述されていないがJSONDecoderがよろしくやってくれるのだろうか?
Create the Row View
リサイズするのにわざわざresizable()呼ぶのは高速化のためか?
Customize the Row Preview
Previewをカスタマイズできると複数の条件での描画結果が一覧できるのか。便利だ。
Create the List of Landmarks
ListのアイテムはListItemとかを継承する必要はなく、Viewを継承していればよい。
Make the List Dynamic
Listに渡す配列の要素がIdentifiableを実装しているとコードがシンプルになる。
Set Up Navigation Between List and Detail
画面遷移にはNavigationViewを使う。
Pass Data into Child Views
child viewにはコンストラクタの引数でデータを渡す。シンプルな解決方法だが、IDEが特に何も支援してくれないので面倒。
navigationTitleなどはView側でセットしておけばNavigationViewに含まれた場合にのみ有効になる。
どんどんコピーしているように見えるがそこら辺はSwiftがよろしくやってくれるのだろう。
Generate Previews Dynamically
単純なデータ型の場合idには.self。
機種ごとの表示もPreviewで一覧できる!rawValueに与える文字列はコマンドで一覧を取得できる。
xcrun simctl list devicetypes
なんでenumでくれないんだろう?β版で製品名がバレるから?
Handling User Input
Mark the User’s Favorite Landmarks
Image(systemName)で組み込みのスターが使える。
Filter the List View
Viewがstructなので本来プロパティは変更できないが、@Stateプロパティは変更できる(多分更新の通知とかもしてる)。
##Add a Control to Toggle the State
staticなViewとdynamicなViewを混ぜる場合や、複数のdynamicなViewを混ぜる場合はForEachを使う。ただし、Listを単にForEachに置き換えるとリスト表示がおかしくなる。ForEachをListにEmbeddする。
@Bindingは@Stateの参照という理解であってる?
@Stateの情報はchild viewに遷移しても保存されている。
Use an Observable Object for Storage
データを保存しておくにはCombineのObservableObjectを使う。@Stateとの使い分けがわからない。
Adopt the Model Object in Your Views
@EnvironmentObjectで宣言したプロパティにはenvironmentObject()でセットされたオブジェクトが名前によらず自動でセットされる。@EnvironmentObjectを複数宣言してもエラーにならないが、Previewは失敗する。
ModelData()をLandmarkListで持つのはいいのか?Appで持つべきでは?と思ったらAppでは@StateObjectでModelData()を持ち、ContentViewにenvironmentObject()でセットしていた。ここでもセットするときに名前は指定しない。Appに対して@EnvironmentObjectは常に一つ?
Viewごとに@StateObjectするのもありだった。
Create a Favorite Button for Each Landmark
@StateObjectのデータを更新したい場合は@Bindingプロパティを使う。
@Stateと@StateObjectってネーミングは良くない。どっちがどっちだよ。
Drawing Paths and Shapes
綺麗なバッジをつくるのだが自分で一からやれと言われたら無理だ。
Animating Views and Transitions
簡単なアニメーションはViewに対してanimation()呼べばできる。便利。
アニメーションtransitionを組み合わせると複雑なアニメーションもできる。自分でつくるのは無理だな。
Composing Complex Interfaces
Add a Category View
Create a Category List
Codableのプロパティには基本データ型以外にenumも使える。
Create a Category Row
適度なpaddingを入れるのがデザインのコツなのかもしれないがさっぱりピンとこない。
Complete the Category View
イメージをぴったり表示するのに5つくらいメソッド呼んでいる。使いこなせる気がしない。
Add Navigation Between Sections
タブ表示はenumで定義してTabView(selection:)に渡す。
Working with UI Controls
Display a User Profile
Badgeのframeについての処理がさっぱりわからない。
hueRotation()でグラデーションを変える。こんなやり方あるのか。
Add an Edit Mode
環境変数は@Environmentを使う。@EnvironmentObjectとネーミングがややこしすぎる。
EditボタンはEditButtonが用意されている。
Define the Profile Editor
さらっと出てくるClosedRangeがよくわからない。
Delay Edit Propagation
EditButtonを押した時のDoneボタンは値を変更するのでCancelボタンは別に用意する。
Interfacing with UIKit
このチュートリアルでUIKitを使いスワイプなどを実装しているが、これらの機能はSwiftUIのみでは実装できない?
Create a View to Represent a UIPageViewController
いまだにアセットカタログの2xとか3xがわからない。
Create the View Controller’s Data Source
contextにいつの間にかcoordinatorがセットされてる。
なぜスワイプが実装できているのかわからない。
Track the Page in a SwiftUI View’s State
delegateがわからない。
Add a Custom Page Control
@objcとか言われてもわからない。
Creating a watchOS App
Add a watchOS Target
WatchOSをターゲットに入れるとSchemeで選択できるようになる。
Share Files Between Targets
ファイルに対してターゲットを追加することで共有できる。
Create the Detail View
scaledToFit()を入れると良くなるらしいが、何が何やらわからん。
Add the Landmarks List
iOS向けのUIがWatchOSでも動いている!
Create a Custom Notification Interface
Notification情報は文字列で送られてくるのか。classやstructのインスタンスの方がミスが少ないと思うが。
Creating a macOS App
Add a macOS Target to the Project
毎回ターゲットを追加しないと共有できないのは不便。同じプロジェクトなのに。
Create a macOS Detail View
詳細画面はプラットフォームごとに用意する。
見た目をMac向けに色々調整するのだが、自力でやれる気がしない。こういうバリエーションを継承とかでやらないのは後々メンテナンスコストを増やしそうな気がする。
MKMapItemでマップアプリを起動する。
Update the Row View
角はcornerRadius()で丸める。
Update the List View
toolbarはiOSでもMacでも使える。
Add a Built-in Menu Command
サイドバーのトグルには専用のSidebarCommands()が用意されている。
Add a Custom Menu Command
フォーカスした値を取得するにはFocusedValueKeyを拡張する。
Add Preferences with a Settings Scene
@AppStorage propertyはUserDefaultsに保存される。UserDefaultsはDBでアプリ起動時(?)にロードされる。
設定画面にはFormを使う。
以上でSwiftUI Tutorials終了。
このチュートリアルでわからなかったこと。
- プラットフォーム間でのデータ共有方法
- デバッグ
- テスト
- ウィジェット
別のチュートリアルがあった。
こちらの方がアクセシビリティに重点を置いている感じ。DispatchQueueを使ったデータ保存の例もある。
各種View
UIのガイドライン
使える機能のリスト