SwiftUI Tutorials: 7日目

今日は「App Design and Layout」章のふたつ、「Composing Complex Interfaces」「Working with UI Controls」。

Composing Complex Interfaces

  •  アプリルート画面の設定
    • root view contrllerの指定
      • SceneDelegate#scene(_:willConnectTo:options:)でwindow.rootViewControllerに対して指定する
      • rootViewControllerには、ルートビューをUIViewControllerのサブクラスであるUIHostingControllerでwrapしたインスタンスを指定する
  • navigation bar itemの指定
    • NavigationView{ List{ … }.navigationBarItems(…) } で指定する
    • navigationBarItems(leading:trailing:)の各パラメタにViewを指定する
      • チュートリアルではPresentationButton
        • PresentationButton(title:destination:)
        • タップ時に新しいコンテンツをsheetで表示する
      • 片側に複数ボタンを表示したい場合はどうする?HStackでまとめただけでは、表示と1度目の遷移はできるが、2度目の遷移ができなかった
  • Navigation階層を進むnavigation buttonの設置
    • NavigationButton(destination:title:)
      • NavigationButton(desitination: someView) { /*initialize title content*/ }
    • PresentationButtonとパラメタの順序(title, destination)が逆なのがややこしい
      • さらにパラメタの型も異なる。PresentationButtonがtitle:Labelであるのに対して、NavigationButtonはtitle:() -> Label。これらの違いは何を意図している?

 

Working with UI Controls

  • @Enviroment
    • @Environment(\.editMode) var mode として、画面の編集状態を保持、変更できるようだが、根底のしくみが理解できなかった。後で調べる

  • SegmentedControl, DatePickerの実用
  • Delay edit propagation
    • 変更内容の保存を、UI操作即時に行うのではなく、あるタイミングまで待機する
    • チュートリアルでは、「Done」タップ時に保存処理を実行
      • self.profile = self.draftProfile
    • 「Done」または「Cancel」タップでProfileEditorが非表示になるタイミングで、最新のprofileをdraftProfileにコピー
      • ProfileEditor(…).onDisappear { self.draftProfile = self.profile }
  • そのほか便利な実装
    • View#hueRotation(_:)で、viewすべての表示について色相をずらすことができる
    • Divider() で縦分割の境界線を簡単挿入できる

 

ざっくりとみて、ふむふむなるほど、という感じだが、従来のUIKitとは画面遷移の概念が大きく異なるのが戸惑いどころ。destination: Text(“some text”)とか、someView.onDisappear {…} とか。いろいろ試行錯誤してなれることが必要と感じた。

コメントを残す