前提・実現したいこと
現在「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
以上、ご教授頂けますと幸いです。よろしくお願いいたします。
あなたの回答
tips
プレビュー