🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

635閲覧

【Swift】カメラロールから画像を読み込む時に失敗する

hkbto

総合スコア14

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/10/28 00:08

編集2019/10/28 01:46

別の画面から遷移してきた時にカメラロールから画像を読み込んで、IMAGEVIEWに表示するアプリを作成しています。
以下のようにソースコードを書いたところ、ゆっくりと実行していくと特に問題なく動作するのですが、カメラロールで画像を選択する時に連打してしまうと、アプリ自体が初期の画面へ戻ってしまい、再度画像を読み込もうとすると全体が黒い画面になってしまいます。
この場合、何が原因として考えられるのでしょうか?
よろしくお願いします。

swift

1 2class MainViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { 3 @IBOutlet weak var imageView:UIImageView! 4 var uiImage:UIImage! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 //画像読込 10 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 11 // 写真を選ぶビュー 12 let photoView = UIImagePickerController() 13 // 写真の選択元をカメラロールにする 14 photoView.sourceType = .photoLibrary 15 // デリゲート 16 photoView.delegate = self 17 // ビューに表示 18 self.present(photoView, animated: true) 19 } 20 } 21} 22 23extension MainViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 24 // 写真を選んだ後に呼ばれる処理 25 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 26 27 //画像サイズ 28 let IMAGE_MAX_SIZE = 1000.0 29 30 // 選択した写真を取得する 31 let tmpImage = info[.originalImage] as! UIImage 32 33 var tmpSize = Double(tmpImage.size.width) 34 35 if(Double(tmpImage.size.width) > IMAGE_MAX_SIZE || Double(tmpImage.size.height) > IMAGE_MAX_SIZE){ 36 if(tmpImage.size.width >= tmpImage.size.height){ 37 tmpSize = IMAGE_MAX_SIZE 38 }else{ 39 tmpSize = IMAGE_MAX_SIZE*Double((tmpImage.size.width/tmpImage.size.height)) 40 } 41 } 42 // ビューに表示する 43 let resize_tmpImage:UIImage = resize(image: tmpImage,width: tmpSize) 44 45 imageView.image = resize_tmpImage 46 if(uiImage.size.width>0){ 47 image_flg = true 48 } 49 // 写真を選ぶビューを引っ込める 50 self.dismiss(animated: true) 51 } 52}

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

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

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

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

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

hameji

2019/10/28 01:36 編集

コードは上下を「```」で囲んでください。 またスコープ({})は開く位置と閉じる位置を合わせてください。 現状では読みづらくて、コードが追いにくく、 読む気が出ません。
hkbto

2019/10/28 01:46

すみません修正しました。よろしくお願いします。
guest

回答1

0

ベストアンサー

何度もクリックすることにより、何度も同じ処理が重複して呼ばれて、
おそらくですが、メモリ不足に陥り落ちるのではないでしょうか?

なので、1回クリックして処理している時は、
重複して処理を行わないようにcheckしないといけないと思います。

よくあるものではHUD(head up display)を利用したものが見受けらると思います。
CocoaPodsに慣れている場合は、swiftだとPKHUDを利用してみるといいと思います。
公式ページ
チュートリアルっぽいページ

CocoaPodsに慣れてないということでしたら、
簡単なものではBool型のメンバ変数(例えば, isProcessing)などを作成し、
それにより条件分岐をすればいいと思います。
例)

Swift

1class MainViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { 2 @IBOutlet weak var imageView:UIImageView! 3 var uiImage:UIImage! 4 var isProcessing: Bool = false 5 6 // 間、省略 7 8 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 9 if isProcessing == false { 10 isProcessing = true 11 12 // ここに実行したい処理=画像の処理、viewのdismiss等 13 14 isProcessing = false // <-このように戻すの忘れないように 15 } else { 16 // 処理中であることを知らせたい場合はUIAlertControllerの表示等 17 } 18 } 19}

投稿2019/10/28 02:04

hameji

総合スコア1380

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

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

hkbto

2019/10/28 12:31

回答ありがとうございます。 ただ、内容の解決には至りませんでした... 下記のようなエラーが出ています。自分でも調べてみましたが、よくわからない状態です。 [discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}
hameji

2019/10/28 16:40 編集

コードをコピペして、シュミレーターで動作確認を行って見ましたが、 特にエラーなく動きましたよ。 何がおかしいんでしょうね、、、 エラーが出るなら、示されているとこ以外に問題があるということになるのかな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問