Slide 1

Slide 1 text

SwiftUIで
 カメラから画像を取得する
 try! Swift Tokyo 2020 Meetup!! 
 
 佐藤剛士 2020 年 1 月 21日
 


Slide 2

Slide 2 text

Who am I
 ● Name
 ● 佐藤剛士(さとうたけし)
 ● Company
 ● Merpay, Inc.(2019/01 ~)
 ● Role
 ● Software Engineer (iOS)
 ● Account
 ● Twitter: @hatakenokakashi
 ● Facebook: 佐藤剛士
 ● GitHub: SatoTakeshiX


Slide 3

Slide 3 text

SwiftUIでImagePickerを使う方法

Slide 4

Slide 4 text

デモアプリ

Slide 5

Slide 5 text

デモアプリの仕様 ● 画像がない場合は「画像がありません」のラ ベルを表示 ● 「画像登録」ボタンタップでアクションシートを 表示 ● 端末がカメラ利用可能なら「 写真を撮る」ボタ ン、フォトライブラリー利用可能なら「アルバム から選択」ボタンを表示 ● ImagePickerViewController で画像を取得す る ● 取得した画像を真ん中に表示する

Slide 6

Slide 6 text

レイアウト

Slide 7

Slide 7 text

デモアプリのUIコンポーネント CameraButton CustomToolBar EmptyImageView Image

Slide 8

Slide 8 text

CameraButton

Slide 9

Slide 9 text

Tips:Buttonのタップ領域を広げたいとき Button 自体の Frame を操作するのではなくて ,Button の View の Frame を操作する

Slide 10

Slide 10 text

CustomToolBar

Slide 11

Slide 11 text

EmptyImageView

Slide 12

Slide 12 text

UIコンポーネントの配置

Slide 13

Slide 13 text

ZStackで配置する ZStack は子 View をオーバーレイで重ねる View コンポーネントの配置に便利

Slide 14

Slide 14 text

CustomToolBarの配置 ※ edgesIgnoringSafeArea で画面下まで表示する Spacer CustomToolBar

Slide 15

Slide 15 text

レイアウト全体

Slide 16

Slide 16 text

ロジック

Slide 17

Slide 17 text

デモアプリの仕様 ● 画像がない場合は「画像がありません」のラ ベルを表示 ● 「画像登録」ボタンタップでアクションシートを 表示 ● 端末がカメラ利用可能なら「 写真を撮る」ボタ ン、フォトライブラリー利用可能なら「アルバム から選択」ボタンを表示 ● ImagePickerViewController で画像を取得す る ● 取得した画像を真ん中に表示する

Slide 18

Slide 18 text

MVVMでSwiftUI

Slide 19

Slide 19 text

ボタンタップのシーケンス図

Slide 20

Slide 20 text

アクションシートのシーケンス図

Slide 21

Slide 21 text

HomeViewModelソース

Slide 22

Slide 22 text

HomeViewModelソース

Slide 23

Slide 23 text

PassthroughSubject ● Combine フレームワークの概念 ○ Publisher ■ 時間経過によって一連の値を配信するプロトコル ○ Subject ■ Publisher の一つ ■ send メソッドで外部から値を配信するプロトコル ● PassthroughSubject は Subject の一種 ● subscriber に値を配信する ● subscribe する前に配信された値は捨てられる ● RxSwift でいう PublishSubject

Slide 24

Slide 24 text

@Published ● @Published 属性をつけてプロパティを公開すると Publisher が作られる ● プロパティの値が変更されるたびにイベントが発行されるようになる ● Publisher にアクセスするには $ 演算子が必要 ● プロパティ更新すれば自動で ( 今回は View 側 ) に通知される

Slide 25

Slide 25 text

HomeView actionSheet/sheetイベント発火

Slide 26

Slide 26 text

SwiftUIとImagePicekrの連携

Slide 27

Slide 27 text

SwiftUIとImagePicekrの連携

Slide 28

Slide 28 text

UIViewControllerRepresentable ● View Controller を SwiftUI と連携するためのプロトコル ● func makeUIViewController(context:) ○ View Controllerを作成するメソッド ● func updateUIViewController(_ :, context) ○ ステートが変更されたら呼ばれるメソッド(今回は @Bindingプロパティが更新されたら呼ばれる) ● func makeCoordinator() ○ このメソッド実装して任意のインスタンスを返すと、 makeUIViewController、 updateUIViewControllerのcontextからこのインスタンスが取得できる ○ Delegate先のインスタンスを返すことで DelegateのあるUIKitクラスでもSwiftUIと連携できる

Slide 29

Slide 29 text

Coodinator

Slide 30

Slide 30 text

まとめ ● SwiftUI で UIImagePickerController との連携方法を解説 ● コンポーネントを組み合わせて配置するときは ZStack が便利 ● PassthroughSubjectでイベントの発火とステータスの更新をバインド ● UIViewControllerRepresentableのmakeCoordinatorはDelegateがあるUIKitクラ スとSwiftUIをつなげる存在

Slide 31

Slide 31 text

サンプルコード https://github.com/SatoTakeshiX/Swif tUICatalog/tree/master/CameraSampl e

Slide 32

Slide 32 text

参考文献 ● 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-th e-basics-of-combine-in-5-minutes-639421268219