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

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

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

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

3969閲覧

Swift: UIImageViewを一画面に複数配置し、ライブラリやカメラから画像を取得したい

dacci

総合スコア6

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2019/09/22 13:20

前提・実現したいこと

Swift初学者です。
Start Developing iOS Apps (Swift)
https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/
を終えた後、これを参考にアプリを作っております。
このチュートリアルのWork with View ControllersのところでUIImageViewをライブラリから取得していますが、
この部分で5枚の画像を取得したいと模索しているところです。
以下の画像のようなイメージです。
イメージ説明

発生している問題

すべて画像1に保存されてしまいます。 原因は`photo1ImageView.image = selectedImage`の部分とわかってはいるのですが、解決方法がわかりません。

該当のソースコード

Swift

1 @IBAction func selectImage1FromPhotoLibrary(_ sender: UITapGestureRecognizer) { 2 //アラート表示のためにインスタンス化 3 let actionSheet = UIAlertController(title: "", message: "写真を設定してください", preferredStyle: UIAlertController.Style.actionSheet) 4 let tappedcamera = UIAlertAction(title: "カメラ", style: UIAlertAction.Style.default, handler: { 5 (action: UIAlertAction!) in 6 self.tappedcamera() 7 }) 8 9 let tappedlibrary = UIAlertAction(title: "ライブラリ", style: UIAlertAction.Style.default, handler: { 10 (action: UIAlertAction!) in 11 self.tappedlibrary() 12 }) 13 14 let cancel = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: { 15 (action: UIAlertAction!) in 16 print("キャンセル") 17 }) 18 19 actionSheet.addAction(tappedcamera) 20 actionSheet.addAction(tappedlibrary) 21 actionSheet.addAction(cancel) 22 23 present(actionSheet, animated: true, completion: nil) 24 25 } 26 27 @IBAction func selectImage2FromPhotoLibrary(_ sender: UITapGestureRecognizer) { 28 //アラート表示のためにインスタンス化 29 let actionSheet = UIAlertController(title: "", message: "写真を設定してください", preferredStyle: UIAlertController.Style.actionSheet) 30 let tappedcamera = UIAlertAction(title: "カメラ", style: UIAlertAction.Style.default, handler: { 31 (action: UIAlertAction!) in 32 self.tappedcamera() 33 }) 34 35 let tappedlibrary = UIAlertAction(title: "ライブラリ", style: UIAlertAction.Style.default, handler: { 36 (action: UIAlertAction!) in 37 self.tappedlibrary() 38 }) 39 40 let cancel = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: { 41 (action: UIAlertAction!) in 42 print("キャンセル") 43 }) 44 45 actionSheet.addAction(tappedcamera) 46 actionSheet.addAction(tappedlibrary) 47 actionSheet.addAction(cancel) 48 49 present(actionSheet, animated: true, completion: nil) 50 } 51 52 func tappedlibrary() { 53 let sourceType:UIImagePickerController.SourceType = 54 UIImagePickerController.SourceType.photoLibrary 55 56 if UIImagePickerController.isSourceTypeAvailable( 57 UIImagePickerController.SourceType.photoLibrary){ 58 // インスタンスの作成 59 let cameraPicker = UIImagePickerController() 60 cameraPicker.sourceType = sourceType 61 cameraPicker.delegate = self 62 self.present(cameraPicker, animated: true, completion: nil) 63 64 } 65 else{ 66 print("error") 67 68 } 69 }

試したこと

画像5枚に、それぞれselectImage1FromPhotoLibraryからselectImage5FromPhotoLibraryを与えています。

試したことは、UIImageの配列をつくり、配列[0]が空なら1枚目に入れ、配列[1] が2枚目に入れ、というふうに考えたのですが
それぞれの配列成分が空かどうか判断することができなかった。

カウントすればいいんじゃないかと思い、画像入れるたびに+1していけば、順番に保存できたが、当然ながら写真を置き換えることはできません。

photo1ImageView.image = nilというふうにif文で条件分岐させようとしましたがこちらもうまくいきませんでした。

解決方法を教えてもらえると幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

もっと単純に考えていいと思います。

画像が5つ、それぞれにUITapGestureRecognizerを設定していると。
そのそれぞれで、画像を取得し、表示するですよね。
勘弁的にコードで示させていただきます。

Swift

1 2 @IBOutlet weak var imageView1: UIImageView! 3 @IBOutlet weak var imageView2: UIImageView! 4 @IBOutlet weak var imageView3: UIImageView! 5 @IBOutlet weak var imageView4: UIImageView! 6 @IBOutlet weak var imageView5: UIImageView! 7 8 private var images: [UIImage] = [] 9 private var selectedImageNo: Int = 0 10 private let imagePickerController = UIImagePickerController() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // imagesの初期設定(特定のファイルもしくはnilで埋める) 16 self.images = [ UIImage(named: "defaultPhoto.png")!, 17 UIImage(named: "defaultPhoto.png")!, 18 UIImage(named: "defaultPhoto.png")!, 19 UIImage(named: "defaultPhoto.png")!, 20 UIImage(named: "defaultPhoto.png")!] 21 loadImage() // imagesの画像を表示 22 // 識別するためにtag設定 23 imageView1.tag = 100 24 imageView2.tag = 200 25 imageView3.tag = 300 26 imageView4.tag = 400 27 imageView5.tag = 500 28 // それぞれにtapGesture設定 29 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(imageTapped)) 30 imageView1.addGestureRecognizer(tapGesture) 31 imageView2.addGestureRecognizer(tapGesture) 32 imageView3.addGestureRecognizer(tapGesture) 33 imageView4.addGestureRecognizer(tapGesture) 34 imageView5.addGestureRecognizer(tapGesture) 35 // imagePickerControllerの設定 36 imagePickerController.sourceType = .photoLibrary 37 imagePickerController.delegate = self 38 } 39 40 private func loadImage() { 41 imageView1.image = self.images[0] 42 imageView2.image = self.images[1] 43 imageView3.image = self.images[2] 44 imageView4.image = self.images[3] 45 imageView5.image = self.images[4] 46 } 47 48 @objc func imageTapped(sender: UIImageView) { 49 selectedImageNo = sender.tag / 100 - 1 // ちょっと賢くない方法かもしれません。 50 present(imagePickerController, animated: true, completion: nil) 51 } 52 53 internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 54 //~~ 間省略 55 56 // photoImageView.image = selectedImageを下記のように書き換え 57 self.images[selectedImageNo] = selectedImage 58 59 // ~~ 他も省略 60 loadImage() // 最後にloadImageで再読み込みを忘れずに。 61 } 62}

元の通りで行いたいなら、それぞれの@IBActionに
imageTappedのsender.tag / 100 - 1を実際の数字にして、
selectedImageNoを設定して、present(imagePickerController, ...
すればいいはずです。

投稿2019/09/24 02:00

編集2019/09/24 02:03
hameji

総合スコア1380

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

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

dacci

2019/09/25 04:04

selectedImageNoとimagesの配列の考えを参考にしたら実現できました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問