前提・実現したいこと
画面1 → 画面2 に遷移する際に、
画面1でできたUIImaViewの情報(画像、アフィン変換、座標)を画面2でも使えるようにしたいのですが上手く情報を格納させることができずに進めずにいます。
画面1のUIImageViewは、カメラロールから選んだ写真を表示させ、そのUIImageViewをPinchやRotationで自由に変形できるようにしています。
発生している問題
座標は格納できたようですが、
preEndPinch,PreEndRotate(CGAffineTransform)、image(UIImage)を画面2でも使えるように格納することができずにいます。
該当のソースコード
画面1
swift
1import UIKit 2 3 4class ViewController2: UIViewController, UIGestureRecognizerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 5 6 @IBOutlet var rotationRecognizer: UIRotationGestureRecognizer! 7 @IBOutlet var pinchRecognizer: UIPinchGestureRecognizer! 8 @IBOutlet weak var get photo: UIImageView! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 //デリゲート先に自分を設定する。 14 rotationRecognizer.delegate = self 15 pinchRecognizer.delegate = self 16 17 //アフィン変換の初期値を設定する。 18 prevEndPinch = getphoto.transform 19 prevEndRotate = getphoto.transform 20 prevPinch = getphoto.transform 21 prevRotate = getphoto.transform 22} 23 24 //ドラッグ終了時のアフィン変換 25 var prevEndPinch:CGAffineTransform = CGAffineTransform() 26 var prevEndRotate:CGAffineTransform = CGAffineTransform() 27 28 //ドラッグ中の前回アフィン変換 29 var prevPinch:CGAffineTransform = CGAffineTransform() 30 var prevRotate:CGAffineTransform = CGAffineTransform() 31 32 33 34 @IBAction func pinchPhoto(_ sender: UIPinchGestureRecognizer) { 35 print("pinch!") 36 //前回ドラッグ終了時の拡大縮小を引き継いだアフィン変換を行う。 37 let nowPinch = 38 prevEndPinch.scaledBy(x: sender.scale, y: sender.scale) 39 40 //拡大縮小と回転のアフィン変換を合わせたものを登録する。 41 getphoto.transform = prevRotate.concatenating(nowPinch) 42 43 44 //今回の拡大縮小のアフィン変換をクラス変数に保存する。 45 prevPinch = nowPinch 46 47 if(sender.state == UIGestureRecognizerState.ended) { 48 //ドラッグ終了時の拡大終了のアフィン変換をクラス変数に保存する。 49 prevEndPinch = nowPinch 50 } 51 52 @IBAction func rotatePhoto(_ sender: UIRotationGestureRecognizer){ 53 54 print("rotate!") 55 //前回ドラッグ終了時の回転を引き継いだアフィン変換を行う。 56 let nowRotate = prevEndRotate.rotated(by: sender.rotation) 57 58 //拡大縮小と回転のアフィン変換を合わせたものをラベルに登録する。 59 getphoto.transform = prevPinch.concatenating(nowRotate) 60 61 //今回の回転のアフィン変換をクラス変数に保存する。 62 prevRotate = nowRotate 63 64 if(sender.state == UIGestureRecognizerState.ended) { 65 //ドラッグ終了時の回転のアフィン変換をクラス変数に保存する。 66 prevEndRotate = nowRotate 67 } 68 69 } 70 //カメラロールから写真を選択する処理 71 @IBAction func choosePicture() { 72 // カメラロールが利用可能か? 73 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 74 // 写真を選ぶビュー 75 let pickerView = UIImagePickerController() 76 // 写真の選択元をカメラロールにする 77 // 「.camera」にすればカメラを起動できる 78 pickerView.sourceType = .photoLibrary 79 // デリゲート 80 pickerView.delegate = self 81 // ビューに表示 82 self.present(pickerView, animated: true) 83 } 84 } 85 86 // 写真を選んだ後に呼ばれる処理 87 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 88 // 選択した写真を取得する 89 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 90 UserDefaults.standard.set(image, forKey:"image") 91 92 // ビューに表示する 93 self.getphoto.image = image 94 95 // 写真を選ぶビューを引っ込める 96 self.dismiss(animated: true) 97 98 } 99 //リコグナイザーの同時検知を許可するメソッド 100 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 101 return true 102 } 103 104 @IBAction func push(_ sender: Any) { 105 print("push") 106 107///格納〜〜〜 108 let xPhoto = getphoto.frame.origin.x 109 let yPhoto = getphoto.frame.origin.y 110 let widthPhoto = getphoto.frame.width 111 let heightPhoto = getphoto.frame.height 112 113 UserDefaults.standard.set(xPhoto, forKey: "xPhoto") 114 UserDefaults.standard.set(yPhoto, forKey: "yPhoto") 115 UserDefaults.standard.set(widthPhoto, forKey: "widthPhoto") 116 UserDefaults.standard.set(heightPhoto, forKey: "heightPhoto") 117 //UserDefaults.standard.set(prevEndPinch, forKey: "Pinch") 118 //UserDefaults.standard.set(prevEndRotate, forKey: "Rotate") 119 120//// 121} 122} 123
画面2
swift
1let xPhoto = UserDefaults.standard.integer(forKey:"xPhoto") 2let yPhoto = UserDefaults.standard.integer(forKey:"yPhoto") 3let widthPhoto = UserDefaults.standard.integer(forKey:"widthPhoto") 4let heightPhoto = UserDefaults.standard.integer(forKey:"heightPhoto") 5let photo:UIImage = UserDefaults.standard.UIImage(forKey:"image") 6 エラー//alue of type 'UserDefaults' has no member 'UIImage' 7
###画像を遷移先に送るためのコード
viewcontrollerからphotoTへ
class viewcontroller
swift
1 2var image:UIImage? 3 4// 写真を選んだ後に呼ばれる処理 5 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 6 // 選択した写真を取得する 7 var image = info[UIImagePickerControllerOriginalImage] as! UIImage 8// 写真を選ぶビューを引っ込める 9 self.dismiss(animated: true) 10 11 } 12 13 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 14 if (segue.identifier == "forimage") { 15 let PT: PhotoT = (segue.destination as? PhotoT)! 16 17 PT.image = image 18 } 19 } 20 21 @IBAction func push(_ sender: Any) { 22 print("push") 23 24 if getphoto.alpha != 0.0{ 25 if image != nil { 26 27 performSegue(withIdentifier: "forimage",sender: nil) 28 } 29 } 30}
class PhotoT
swift
1//ボタンを押したら画面遷移 ボタンのIdentifier "forage" 2 @IBOutlet weak var photo: UIImageView! 3 var image:UIImage! 4 5photo.image = image
ですが、photoにはなにも画像が表示されませんでした。
参考資料
補足情報(FW/ツールのバージョンなど)
Swiftのversionは4.1.2
Xcodeのversionは9.4.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/04 15:50
2019/02/04 16:35
2019/02/05 01:14
2019/02/05 03:28
2019/02/05 04:56
2019/02/05 05:08 編集
2019/02/06 07:19