前提・実現したいこと
ImagePickerで画像を選択したあと、選択した画像をクロッピング処理への遷移を想定しています。
画像云々の部分はあまり関係ない話ですので、ここでは便宜上画面A・画面Bと表現します。
実現したいこととしては、下記の通りです。
- 画面Aをモーダル表示する
- 画面Aを閉じられると、画面Bをモーダル表示する
- その後、画面Bが閉じられること
画面Aを開いて閉じて、画面Bを開いて閉じて、の動作をSwiftUIでスムーズにできるようになりたいです。
発生している問題・エラーメッセージ
現在発生している問題は、
- 画面Aを閉じたあと、すぐに画面Bを表示した場合、画面Bは閉じられない (dismissが効かなくなる)
- 画面Aを閉じたあと、1秒待ってから画面Bを表示した場合、画面Bは閉じられる
現在、画面A -> (1秒待ち) -> 画面B となっているので、この1秒待ちをなくしたいと考えています。
該当のソースコード
import SwiftUI struct SampleTwoModalView : View { enum SheetType { case imagePick case imageCrop } @State private var currentSheet: SheetType = .imagePick @State private var sheetIsPresented = false @State private var image: UIImage? = nil var body: some View { VStack { Button(action: { self.currentSheet = .imagePick self.sheetIsPresented = true }, label: { Text("select images & crop images") }) } .sheet(isPresented: $sheetIsPresented) { if (self.currentSheet == .imagePick) { ImagePickerView(sourceType: .photoLibrary, onCanceled: { // on cancel }) { (image) in self.image = image //画像を選択するとクロッピング画面へ遷移させる (X) DispatchQueue.main.asyncAfter(wallDeadline: .now() + .milliseconds(1000)) { self.currentSheet = .imageCrop self.sheetIsPresented = true } } } else if (self.currentSheet == .imageCrop) { ImageCropView(originalImage: self.image!, onCanceled: { // on cancel }) { (image) in // on success } } } } }
試したこと
(X)の処理を下記のようにすると、画面Bへの遷移はできるが、画面Bをdismissできない状態になります。
//画像を選択するとクロッピング画面へ遷移させる (X) DispatchQueue.main.async { self.currentSheet = .imageCrop self.sheetIsPresented = true }
補足情報(FW/ツールのバージョンなど)
- Xcode 11.6
- iOS 13.3, iOS 13.6
一つ前のブランチ https://github.com/CH3COOH/TOCropViewController/tree/43c05800039a72bb26b999420935118b1ecec6b1 を落としてきて、
DispatchQueue.main.async { //After(wallDeadline: .now() + .milliseconds(1000)) {
に変更して実行してみたのですが、画面B(クロッピング画面)は正常に閉じました。
検証方法はこれで合っているでしょうか?
Xcode 11.5 + iOS 13.5 (Simulator)
環境自体は Xcode 11.6 + iOS 13.6 (Sim) でしたが、検証方法は合ってます!
dismissアニメーション中に `sheetIsPresented`を`true`にしてシートを表示させることで内部的なフラグ(?)がおかしくなっているのではないかと推測しているのですが、 Xcode 11.5と11.6 (もしくは iOS 13.5と13.6)で違いがあるのでしょうか。
SwiftUIをチビチビ勉強中で、勉強がてら覗いてみただけなんです。
なので詳しいことはよく分かりません。
あとでXcode落としてみます。
11.6でも正しく動いたのでおかしいな‥と思ったら、SchemeがSwiftUIじゃないやつになってました。失礼しました‥。
回答2件
あなたの回答
tips
プレビュー