try! Swift Tokyo 2020 Meetup!! https://tryswifttokyo.connpass.com/event/160481/
の登壇資料です
SwiftUIで カメラから画像を取得する try! Swift Tokyo 2020 Meetup!! 佐藤剛士 2020 年 1 月 21日
View Slide
Who am I ● Name ● 佐藤剛士(さとうたけし) ● Company ● Merpay, Inc.(2019/01 ~) ● Role ● Software Engineer (iOS) ● Account ● Twitter: @hatakenokakashi ● Facebook: 佐藤剛士 ● GitHub: SatoTakeshiX
SwiftUIでImagePickerを使う方法
デモアプリ
デモアプリの仕様● 画像がない場合は「画像がありません」のラベルを表示● 「画像登録」ボタンタップでアクションシートを表示● 端末がカメラ利用可能なら「 写真を撮る」ボタン、フォトライブラリー利用可能なら「アルバムから選択」ボタンを表示●ImagePickerViewControllerで画像を取得する● 取得した画像を真ん中に表示する
レイアウト
デモアプリのUIコンポーネントCameraButton CustomToolBarEmptyImageViewImage
CameraButton
Tips:Buttonのタップ領域を広げたいときButton自体のFrameを操作するのではなくて,ButtonのViewのFrameを操作する
CustomToolBar
EmptyImageView
UIコンポーネントの配置
ZStackで配置するZStackは子Viewをオーバーレイで重ねるViewコンポーネントの配置に便利
CustomToolBarの配置※edgesIgnoringSafeAreaで画面下まで表示するSpacerCustomToolBar
レイアウト全体
ロジック
MVVMでSwiftUI
ボタンタップのシーケンス図
アクションシートのシーケンス図
HomeViewModelソース
PassthroughSubject●Combineフレームワークの概念○Publisher■ 時間経過によって一連の値を配信するプロトコル○Subject■Publisherの一つ■sendメソッドで外部から値を配信するプロトコル●PassthroughSubjectはSubjectの一種●subscriberに値を配信する●subscribeする前に配信された値は捨てられる●RxSwiftでいうPublishSubject
@Published●@Published属性をつけてプロパティを公開するとPublisherが作られる● プロパティの値が変更されるたびにイベントが発行されるようになる●Publisherにアクセスするには$演算子が必要● プロパティ更新すれば自動で(今回はView側)に通知される
HomeView actionSheet/sheetイベント発火
SwiftUIとImagePicekrの連携
UIViewControllerRepresentable●View ControllerをSwiftUIと連携するためのプロトコル● func makeUIViewController(context:)○ View Controllerを作成するメソッド● func updateUIViewController(_ :, context)○ ステートが変更されたら呼ばれるメソッド(今回は @Bindingプロパティが更新されたら呼ばれる)● func makeCoordinator()○ このメソッド実装して任意のインスタンスを返すと、 makeUIViewController、updateUIViewControllerのcontextからこのインスタンスが取得できる○ Delegate先のインスタンスを返すことで DelegateのあるUIKitクラスでもSwiftUIと連携できる
Coodinator
まとめ●SwiftUIでUIImagePickerControllerとの連携方法を解説● コンポーネントを組み合わせて配置するときはZStackが便利● PassthroughSubjectでイベントの発火とステータスの更新をバインド● UIViewControllerRepresentableのmakeCoordinatorはDelegateがあるUIKitクラスとSwiftUIをつなげる存在
サンプルコードhttps://github.com/SatoTakeshiX/SwiftUICatalog/tree/master/CameraSample
参考文献●PassthroughSubject○ https://developer.apple.com/documentation/combine/passthroughsubject● Learn & Master ⚔ the Basics of Combine in 5 Minutes○ https://medium.com/ios-os-x-development/learn-master-%EF%B8%8F-the-basics-of-combine-in-5-minutes-639421268219