前提・実現したいこと
UIView
のサブクラスを保存したい。
現在、iOS向けにある作図アプリを作成しています。
キャンバスとしてUIView
のサブクラスを作成し、UIGestureRecognizer
を使用して、タップした場所に記号(これもUIView
のサブクラス)を描画(キャンバスにaddSubview
)したり、逆に削除(キャンバスからremoveFromSuperview
)するようにしています。
このキャンバスを保存することで、複数のキャンバスを管理したり、アプリを再起動した際に再編集できるようにしたいと考えています。
UIView
のサブクラスであるキャンバスをどのように保存すればよいでしょうか。これまで、データの永続化はRealm
を使用してきたので、今回もRealm
を使用したいと思っています。
方法としては、
- キャンバス、記号ともに初期化に必要な情報を個別に取得して、
Realm
に保存し、編集する際は、Realm
の情報を取得して、キャンバスと記号を一から作成 - キャンバス全体を一括で何らかのデータに変換し、
Realm
に保存し、編集する際はRealm
から取得して、復元
を考えていますが、何か良い方法はあるでしょうか。
該当のソースコード
Swift
1// キャンバス 2class CanvasView: UIView { 3 /// キャンバス上の記号を管理する 4 /// キャンバス上に記号をaddSubviewした際に、その記号をここに追加する 5 var drawSpaces = Array<Symbol>() 6 7 override init(frame: CGRect) { 8 super.init(frame: frame) 9 // ジェスチャーの追加 10 addGesture() 11 } 12 /// ジェスチャーを追加する 13 func addGesture() { 14 // タップジェスチャーの追加 15 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapCanvas(_:))) 16 self.addGestureRecognizer(tapGesture) 17 // パンジェスチャーの追加 18 let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panCanvas(_:))) 19 self.addGestureRecognizer(panGesture) 20 } 21 22 override func draw(_ rect: CGRect) { 23 // UIBezierPathのインスタンス生成 24 let grid = UIBezierPath() 25 // 以下略 26 // 記号を描画する場所の目安のためにグリッド線を描画 27 } 28 29 // 以下略 30} 31 32// 記号 33class Symbol: UIView { 34 var symbolData = "記号の名前" 35 36 required init(point: CGPoint) { 37 super.init(frame: CGRect(origin: point, size: CGSize(width: 30, height: 20))) 38 let imageView = UIImageView(image: "記号の画像") 39 addSubview(imageView) 40 } 41 42 required init?(coder aDecoder: NSCoder) { 43 fatalError() 44 } 45}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/16 05:21 編集
2018/02/16 05:24
2018/02/16 06:53