質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1236閲覧

storyboard上に存在しない画面の操作について

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/06/21 11:46

ImagePickerControllerで取得した値をCLImageEditorで編集するが、編集画面から戻った際に動作が出来ない

こんばんは、質問失礼致します。勉強不足で至らない点があると思いますが、よろしくお願い致します。
タイトルのようにカメラを起動させて撮影した後に取得した画像をCLImageEditorというライブラリで編集できるようにしているのですが、編集画面から戻ると操作が出来なくなってしまいます。調べてはいるのですが、あまりCLImageEditorに関しての日本語記事が少なく理解出来ないでいます。今現在 imagePickerController メソッドで取得した値をCLImageEditorのインスタンス生成時に渡し、 pushViewController メソッドで編集画面を起動させています。
編集画面ではNavigationBarが表示されていてleftItemのBackをタップすると撮影した画像の画面に戻りフリーズされてしまいます。
もし解決方法がお分かりの方がいらしたら教えていただきたいです。よろしくお願いいたします。

該当のソースコード

swift

1// 真ん中のタブはボタンとして扱う 2 tabBarController.setAction({ 3 // カメラを指定してピッカーを開く 4 // もしカメラが使えるかの判定関数 5 if UIImagePickerController.isSourceTypeAvailable(.camera) { 6 // UIImagePickerControllerのインスタンスを作成 7 let pickerController = UIImagePickerController() 8 // pickerControllerのsourceTypeを.cameraにする 9 pickerController.sourceType = .camera 10 // 写真を撮った後の関数にViewControllerを指定する 11 pickerController.delegate = self 12 // カメラをpresentメソッドで表示させる 13 self.present(pickerController, animated: true, completion: nil) 14 } 15 }, at: 1) 16 } 17 18 // 写真を撮影/選択した時に呼ばれるメソッド 19 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) { 20 if info[UIImagePickerControllerOriginalImage] != nil { 21 // 撮影/選択された画像を取得する 22 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 23 24 // 後でCLImageEditorライブラリで加工する 25 print("DEBUG_PRINT: image = (image)") 26 // CLImageEditorにimageを渡して、加工画面を起動する 27 let editor = CLImageEditor(image: image)! 28 editor.delegate = self 29 picker.pushViewController(editor, animated: true) 30 } 31 } 32 33 // キャンセルした時に呼ばれるDelegate 34 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 35 // dismissメソッドで今開いている画面を閉じる 36 picker.dismiss(animated: true, completion: nil) 37 } 38 39 // CLImageEditorでキャンセルされた時にこのメソッドで前の画面に戻る 40 func imageEditorDidCancel(_ editor: CLImageEditor!) { 41 editor.dismiss(animated: true, completion: nil) 42 } 43 44 // CLImageEditorで加工が終わった時に呼ばれるメソッド 45 func imageEditor(_ editor: CLImageEditor!, didFinishEditingWith image: UIImage!) { 46 // 投稿の画面を開く 47 // PostviewControllerのNavigationControllerのidentifierに "Post"を設定する 48 let navigationController = self.storyboard?.instantiateViewController(withIdentifier: "Post") as! UINavigationController 49 50 let viewControllers = navigationController.viewControllers; 51 let postViewController = viewControllers[0] as! PostViewController; 52 53 postViewController.image = image! 54 editor.present(navigationController, animated: true, completion: nil) 55 } 56 57}

試したこと

CLImageEditorDidCancelというメソッドがあったので書いてみたのですがこのメソッドが呼ばれずにいます。そもそも画面上のどこにキャンセルが呼び出されるのか分かりせん。もしCLImageEditorの編集画面上にあるNavigationBarの動作を変更し、タップした時に撮影画面まで戻れればと考えたのですが、どのようなコードを書けばいいかも分かりません。もしStoryboard上にない画面の操作方法がお分かりでしたら教えていただきたいです。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Xcode Version 9.2

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CLImageEditorって、
https://github.com/yackle/CLImageEditor
ですよね?

Issuesに、今質問されている件と同じ話が書かれていました。
https://github.com/yackle/CLImageEditor/issues/97

また、
https://stackoverflow.com/questions/44837250/camera-view-of-uiimagepickercontroller-frozen-when-navigating-back-to-it
でも同様の質問が書かれていて、どうもCLImageEditorとは関係なく
UIImagePickerControllerの問題で発生するようです。

回避方法としては、CLImageEditorから戻る時に、
カメラビューに戻って再撮影できるようにするのではなく、
「戻る」ボタンを「キャンセル」ボタンに強制的に変更して、
UIImagePickerControllerを終了させる形にするしかないようです。

そこで、UIImagePickerControllerのdelegateを処理するクラス
(didFinishPickingMediaWithInfoのメソッドを定義しているクラス)に
次のコードを追記することで回避できることを確認しました。

swift

1 func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { 2 let pickerController = navigationController as! UIImagePickerController 3 if pickerController.sourceType == .camera { 4 viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonDidPush)) 5 } 6 } 7 8 @objc func cancelButtonDidPush() { 9 dismiss(animated: true, completion: nil) 10 }

投稿2018/06/21 17:02

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/21 17:31

ご回答ありがとうございます。 教えていただいたことを実機で試してみたところ上手く動作しました。 なるほどです。pushViewControllerで新しいViewを押し込んで、UIImagePickerControllerが戻ってきた時に残ってる?ということなんですね!navigationControllerメソッドに関しても初めて知りとても勉強になりました。 とてもご丁寧に回答していただいてありがとうございました。 このバグを残したまま初リリースをしようと思っていたところだったので助かりました。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問