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

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

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

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

0回答

870閲覧

【Swift】popoverで表示させたUITableViewから呼び出したUIImagePickerControllerの画像をpopover元のビューに配置したい

DM1225

総合スコア4

iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/02/29 12:08

編集2020/02/29 12:29

前提・実現したいこと

現在「Swift5」でiPad用の画像ビューワアプリを制作しております。
実現したいこととしまして、
1.画面(UIViewController)内のボタン(UIButton)を押す
2.ポップオーバーでメニュー(UITableView)が表示
3.メニュー内の「”写真”」(Cell)を押す
4.フォトライブラリが開く
5.フォトライブラリの画像を選択
6.元の画面に選択した画像が配置される
という機能を作りたいと考えています。

選択した画像が画面に表示されるところまではできたのですが、
現在のコードでは表示された画像が元の画面内に配置されていない状態のようでした。
例えば、画面をパンやピンチジェスチャー等で動かしたり、拡大縮小したとしても、
表示されている画像は一緒に動いてくれませんでした。
原因となっている記述箇所はなんとなく特定できているのではないかと思っているのですが、
どのように記述を変えてあげればよいのか分からない状態です。
イメージ説明
以下がコード内容となります。
(プログラミング初心者のため、記述内容や実装方法に雑な点があること、ご容赦ください。)

該当のソースコード

■元となる画面クラス

class ViewController : UIViewController, UIPopoverPresentationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() //メニュー呼び出しボタン let button1 = UIButton(type: UIButton.ButtonType.system) /* ...ボタン設定記述の為省略 */ button1.addTarget(self, action: #selector(buttonTapped(_:)), for: UIControl.Event.touchUpInside) view.addSubview(button1) } @objc func buttonTapped(_ sender: UIButton) { let menuView = MenuViewController() menuView.modalPresentationStyle = .popover if let presentationController = menuView.popoverPresentationController{ presentationController.sourceView = self.view presentationController.sourceRect = sender.frame presentationController.delegate = self } present(menuView, animated: true,completion: nil) } }

■ポップオーバーで表示させるメニュー画面クラス

class MenuViewController: UITableViewController , UINavigationControllerDelegate , UIImagePickerControllerDelegate { let menuTex: [String] = ["ファイル","写真","カメラ","テキスト"] override func viewDidLoad() { super.viewDidLoad() } /* ...tableViewのセル、セクション等の設定記述の為省略 */ override func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ switch indexPath.section { case 0: print("ファイル") //↓「写真」選択時 case 1: if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ let picker = UIImagePickerController() picker.modalPresentationStyle = .pageSheet picker.delegate = self picker.sourceType = UIImagePickerController.SourceType.photoLibrary self.present(picker,animated: true) tableView.deselectRow(at: indexPath, animated: true) } case 2: print("カメラ") case 3: print("テキスト") default: break } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage let imageView = UIImageView(image: pickedImage) //画像を画面に追加 imageView.frame = CGRect(x: 0, y: 0, width: pickedImage.size.width, height: pickedImage.size.height) let vc : UIViewController = self.presentingViewController as! UIViewController vc.view.addSubview(imageView) //配置位置の指定 imageView.center = vc.view.center //画面を閉じる self.presentingViewController?.dismiss(animated: true, completion: nil) self.dismiss(animated: true) } }

考えられる原因

下記の記述箇所に問題があるように考えておりますが、如何でしょうか。

let vc : UIViewController = self.presentingViewController as! UIViewController vc.view.addSubview(imageView) //配置位置の指定 imageView.center = vc.view.center

以上、ご教授頂けますと幸いです。よろしくお願いいたします。

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

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

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

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

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

hoshi-takanori

2020/02/29 13:12

画像が選択された時に UIImageView を動的に生成して、元の画面に無理やり addSubview してますが、元の画面にあらかじめ UIImageView を用意しておいて、それに選択された画像をセットする方がいいと思います。また、元の画面と MenuViewController のやりとりは delegate を使いましょう。
DM1225

2020/02/29 13:53

ご回答頂きありがとうございます。 UIImageViewを動的に生成した上でaddSubviewをしている理由としましては、 配置する画像は、任意で複数追加したり削除したりすることができるという仕様にしたいという意図があり、配置画像数が変動するため、現状のように配置する際にUIImageViewを生成するというような方法を取っておりました。こちら前提が足りておらず、申し訳ございません。 delegateに関しましては、現状の私の理解度が足りておらず、delegateの使用方法がうまく掴めていないという点があり、現在のような実装方法になってしまっておりました。 delegateの理解を深め、実装方法を見直す事を検討させて頂きます。ご指摘頂きありがとうございます!
hoshi-takanori

2020/02/29 14:17

任意で複数追加したり削除するにしても、元の画面の預かり知らぬところで勝手に追加されたら管理できませんので、元の画面側で UIImageView の配列を持つなりして管理する必要があります。 また、delegate についてはこちらがわかりやすいかと思います。 https://qiita.com/narukun/items/326bd50a78cf34371169
DM1225

2020/02/29 14:27

なるほど・・・別のクラスから生成されたUIImageViewを直接別のクラスにある画面に追加するという方法を取っていることが問題点なのですね。理解しました、ありがとうございます。 また、delegateに関しまして分かりやすい参考記事をご紹介頂きありがとうございます! こちらの記事等を参考に勉強させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問