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

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

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

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

Swift

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

Q&A

1回答

318閲覧

UIImageView(アフィン変換と画像)の情報を格納したい

mimamo

総合スコア44

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/02/01 15:25

編集2022/01/12 10:55

前提・実現したいこと

画面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

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

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

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

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

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

guest

回答1

0

swift

1let photo:UIImage = UserDefaults.standard.UIImage(forKey:"image") 2  エラー//alue of type 'UserDefaults' has no member 'UIImage'

質問に提示されている通り、これではUserDefaultsから画像を読み込むことはできません。
それ以前に、画面1で"image"というキーに画像を保存していないようにも見えます。

UserDefaultsに画像を保存するなら、UIImagePNGRepresentationで一旦Data型に変換してから保存する必要があります。
UserDefaultsから画像を読み込むなら、Data型の保存データを読み込み、それをUIImageに変換する必要があります。

そもそも、画面1から画面2に画像を渡したいだけであれば、UserDefaultsに保存するようなことはせず、画面2にUIImageのプロパティを定義し、画面遷移時に画面2のプロパティに画像を引き渡すだけでよさそうに思います。

投稿2019/02/03 16:00

TakeOne

総合スコア6299

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

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

mimamo

2019/02/04 15:50

ご回答ありがとうございます!なるほど、、 UIImageのプロパティのやり方でやってみようと思います! segueで引き渡すということでしょうか?
TakeOne

2019/02/04 16:35

segueというのは画面遷移の方法を表す言葉であって、データの引き渡し方法を表す言葉ではありません。 segueでもpresentでもどっちの方法で画面遷移してもいいので、プロパティを使ってデータを引き渡せばいいです。
mimamo

2019/02/05 01:14

ありがとうございます。 画面に配置した遷移用のボタン(他にもボタンを配置してあります)を押した時にimageのデータを引き渡すようにしたく、参考資料を元にコーディングしてみたのですが引き渡しが上手くできていないようで UIImageView(photo)に画像が表示されません、、 アドバイスよろしくお願いいたします。
TakeOne

2019/02/05 03:28

どうしてうまくいかないのか自分で調べずに人に聞いてるんですか? UIImagePickerControllerでimageに画像が読み込めているかとか、prepareメソッドでimageを引き渡す時にどんなものを引き渡しているかとか、画面遷移先でimageを取り出す時に何が入っているかとか、詳しい動作時状況をprintして、どこまでできていて、どこからうまくいっていないのか調べないのですか?
mimamo

2019/02/05 04:56

おっしゃる通り、どこからが上手くいかないのか自分で確認するべきでした。 関数imagePickerController内でimageを読み込み、UIImageiViewに表示させることはできたのですが、prepareメソッドでimageをprintしてみると中身はnilでした。 nilになる原因として変数が関係するのかなと思ったので 同じクラスで定義している変数 var prevPinch:CGAffineTransform = CGAffineTransform() の prePinchをprintしてみました。こちらは中身をprintしてくれました。 segueのidentifierはforimageと定義しているので他に何が原因なのかわかりません、、 よろしくお願いします。
TakeOne

2019/02/05 05:08 編集

プログラミングの基礎の話になりますが、変数のスコープというのは理解していますか? UIImagePickerControllerで取得した画像を格納しているimageという変数とprepareメソッドの中で参照しているimageという変数は別のものであることを理解していますか? それをイメージせずにプログラミングしているのであれば、プログラミングの基礎から勉強し直す必要があると思います。
mimamo

2019/02/06 07:19

お返事遅くなり申し訳ないです。 ご回答ありがとうございます。 理解していませんでした、、 まだまだ基礎が身についていないので、もう一度基礎に戻って勉強しようと思います。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問