前提・実現したいこと
画面AとBがあるとします.
画面Aはメニュー画面で,画面Bへ遷移するボタンがあります.
画面Bでは,画像にスタンプを貼り付けるような編集作業ができます.
画面Bで編集し終えた後,画面Aに戻り,また画面Bを開いたら,
編集していた画面に戻したいです.
スタンプは画面BにaddViewされており,戻ってきたときにも
また動かせるようにしたいので,一括画像保存とかではありません.
addViewされたViewの座標を配列かなにかで保存すれば
いいのかなと考えておりますが,もっとスマートなやり方はないでしょうか.
また,座標を保存する際に,いい感じのメソッドがあれば教えていただきたいです.
今のところは,frameが使えそうだと考えております.
よろしくおねがいします.
追記
画面AからBへはpresent()を使用しています.
画面Bは全画面表示なので画面BはAの子供となるのでしょうか?
画面Bはだいたい以下の構造です.(本当は下のContainerViewを変えるボタンがあります)
CollectionViewには,スタンプの画像一覧が表示されます.
ContainerViewの中身は切り替えができます.
そこのところは,こちらを参考にしました.
動作イメージは,
Cellに表示されているスタンプ(Cell)を長押し → スタンプが手の動きに合わせて移動(Cellの画像を複製) → ImageViewに持っていく → 貼り付ける
貼り付けたものを長押し → スタンプを移動
といった具合です.
BVCは,ContainerViewの表示を切り替えるものが記述されています.
(上リンク)
CVCでは
① 長押しでCellの画像を複製,画像移動のために,ロングプレスとパンを設定
Swift
1 func setGesture() { 2 //長押しをセット 3 let longPressGesture = 4 UILongPressGestureRecognizer(target: self, 5 action: #selector(self.longPress(_:))) 6 longPressGesture.delegate = self 7 8 //パンをセット 9 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(HGotItemViewController.panView(sender:))) 10 panGesture.delegate = self 11 12 self.collectionView.addGestureRecognizer(longPressGesture) 13 self.collectionView.addGestureRecognizer(panGesture) 14 15 }
② Cellを長押しされたらCell内の画像のUIImageViewを作る
Swift
1 2 @objc func longPress(_ sender: UILongPressGestureRecognizer){ 3 if sender.state == .began { 4 5 //押された座標とCell番号 6 newTapPoint = sender.location(in: view) 7 tapPoint = sender.location(in: view) 8 let indexPath = self.collectionView.indexPathForItem(at: tapPoint) 9 10 if indexPath != nil{ 11 //indexPathからアイテムの画像を判断 12 itemImage = (UIImage(named: "item/(indexPath!.row)")?.withRenderingMode(.alwaysTemplate))! 13 14//追加するViewが手の位置にくるように設定 15 stampView = UIImageView(frame: CGRect(x: tapPoint.x,y: tapPoint.y, width: 168, height: 90)) 16 stampView.backgroundColor = .red 17 stampView.center = CGPoint(x:tapPoint.x+470,y:tapPoint.y) 18 stampView.image = itemColorImage 19 20//追加したあとも位置を変えられるように長押しとパンを設定 21 22 let longPressGesture2 = 23 UILongPressGestureRecognizer(target: self, 24 action: #selector (self.move(_:))) 25 longPressGesture2.delegate = self 26 stampView.addGestureRecognizer(longPressGesture2) 27 28 let panGesture2 = UIPanGestureRecognizer(target: self, action: #selector(self.panView(sender:))) 29 panGesture2.delegate = self 30 stampView.addGestureRecognizer(panGesture2) 31 32 stampView.isUserInteractionEnabled = true 33 34 //Viewを追加 35 self.parent?.view.addSubview(stampView) 36 } 37 }else if sender.state == .ended{ 38 39 //画像以外のところに載せたら消す 40 if imageView.frame.contains(endPoint){ 41 print("endPoint=",endPoint) 42 }else{ 43 stampView.removeFromSuperview() 44 } 45 } 46 } 47 48 }
を行っています.
データの永続化もしたいです.
画面Aに戻った,アプリを落としたあとも,画面Bにくると編集していた画面を
表示させたいです.
永続化方法については,userDefaultsを使用しようと考えていますが,
初心者のため,何もわからず,データもそんな大きくならないと思うので
とりあえず検索して出てきたこれにしよう程度のです.
なので,もし,他に良い方法があれば教えて下さい.
回答1件
あなたの回答
tips
プレビュー