potatotips #67 (iOS/Android開発Tips共有会) https://potatotips.connpass.com/event/152899/
登壇資料です。
GeometryReaderでSwiftUIのViewを キャプチャする potatotips #67 佐藤剛士 2019 年 12 月 17日
View Slide
Who am I ● Name ● 佐藤剛士(さとうたけし) ● Company ● Merpay, Inc.(2019/01 ~) ● Role ● Software Engineer (iOS) ● Account ● Twitter: @hatakenokakashi ● Facebook: 佐藤剛士 ● GitHub: SatoTakeshiX
SwiftUI実践入門を技術書典で配布
SwiftUIでキャプチャはとれる?
Viewのキャプチャをとるのに必要な情報は?
UIViewでやるなら
Viewのキャプチャをとるのに必要な情報●ViewのBounds(矩形情報)●ViewのCALayer
Viewのキャプチャをとるのに必要な情報●ViewのBounds(矩形情報)●ViewのCALayerUIViewにはプロパティとしてあるけどSwiftUIのViewにはない!
どうしよう?
ViewのBounds(矩形情報) -> GeometryReaderで取得ViewのCALayer -> SwiftUIからUIViewに変換
GeometryReader●SwiftUIで座標情報を取得できる特別なView● 自身のサイズと座標空間を返すクロージャーをプロパティとして保持● クロージャーの引数GeometryProxyに準拠したインスタンスから自身のサイズやRootViewの座標情報を取得できる
SwiftUIのorigin座標●UIKitと同じく左上から始まる●RootViewはデフォルトではステータスバーの下から始まる●edgesIgnoringSafeAreaをつかうことでステータスバーの上から計算することも可能
geometry.frame(in: .global)でRootViewの座標情報●UIKitと同じく左上から始まる
UIViewとSwiftUIの座標情報の取得フレームワーク 型 プロパティ・メソッド 内容UIKit UIView frame 親Viewの座標空間での矩形情報UIKit UIView bounds 自身の座標空間での矩形情報SwiftUI GeometryReader geometry.frame(in:.global)RootViewの座標空間での矩形情報SwiftUI GeometryReader geometry.frame(in:.local)自身の座標空間での矩形情報
Scrollで動的に座標が変わる
矩形の情報をとれた!
SwiftUIからUIViewに変換
UIHostingControllerを使う
UIViewからキャプチャ
お絵かきアプリをレイアウト
親ViewでCanvasのRect保持Canvasにわたす
CanvasのRectをonAppearで更新@Bindingなのでプロパティ更新で親にも通知される
保存ボタンタップ
EXC_BAD_INSTRUCTIONでアプリが落ちる
Take 2
UIHostingControllerにselfではなくて、データを渡してCanvas Viewを作る
UIHostingControllerにselfではなくて、データを渡してViewを作る
キャプチャがとれた!
まとめ:SwiftUIでViewのキャプチャをとるには●GeometryReaderでViewの矩形情報を取得● 子Viewから親ビューに子の矩形情報を渡す●SwiftUIからUIViewにUIHostingControllerで変換○ 渡すViewはselfではなくその場でインスタンスを作る●UIViewのview.layer.render(in: context)でキャプチャ取得
サンプルコードhttps://github.com/SatoTakeshiX/SwiftUICatalog/tree/master/GeometryReaderSample