Open12

SwiftUIの勉強

oiltypebluroiltypeblur

Creating and Combining Views

https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

とりあえずデフォルトのプロジェクトで実行するとエラーになる。signingとやらが必要?
それはそれとしてCanvasでのPreviewはできた。

Swift UI InspectorはPreviewだけでなくソースコードでCommand+Clickしても起動できる!単にレンダリングしてるのではないのだな。

GUIでレイアウトしていくのは無駄コードが出そうで拒否感があったが、少なくともシンプルなレイアウトでは簡潔に表現してくれる。

画像や地図などコンポーネントごとにViewをつくっていくのが流儀なのか。一画面に対してたくさんViewできるのはややこしくないか?

secondaryカラーってなんだ?どういう基準で使う色なのかわからない。

oiltypebluroiltypeblur

Building Lists and Navigation

https://developer.apple.com/tutorials/swiftui/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でくれないんだろう?β版で製品名がバレるから?

oiltypebluroiltypeblur

Handling User Input

https://developer.apple.com/tutorials/swiftui/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するのもありだった。
https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

Create a Favorite Button for Each Landmark

@StateObjectのデータを更新したい場合は@Bindingプロパティを使う。

@Stateと@StateObjectってネーミングは良くない。どっちがどっちだよ。

oiltypebluroiltypeblur

Drawing Paths and Shapes

綺麗なバッジをつくるのだが自分で一からやれと言われたら無理だ。

oiltypebluroiltypeblur

Animating Views and Transitions

簡単なアニメーションはViewに対してanimation()呼べばできる。便利。
アニメーションtransitionを組み合わせると複雑なアニメーションもできる。自分でつくるのは無理だな。

oiltypebluroiltypeblur

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:)に渡す。

oiltypebluroiltypeblur

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ボタンは別に用意する。

oiltypebluroiltypeblur

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とか言われてもわからない。

oiltypebluroiltypeblur

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のインスタンスの方がミスが少ないと思うが。

oiltypebluroiltypeblur

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終了。

このチュートリアルでわからなかったこと。

  • プラットフォーム間でのデータ共有方法
  • デバッグ
  • テスト
  • ウィジェット
oiltypebluroiltypeblur

別のチュートリアルがあった。
https://developer.apple.com/tutorials/app-dev-training
こちらの方がアクセシビリティに重点を置いている感じ。

DispatchQueueを使ったデータ保存の例もある。
https://developer.apple.com/tutorials/app-dev-training/persisting-data

各種View
https://qiita.com/MaShunzhe/items/1375be076e1734e1cc42

UIのガイドライン
https://developer.apple.com/design/human-interface-guidelines/

使える機能のリスト
https://developer.apple.com/documentation/technologies