###前提・実現したいこと
300×300のマップビューの上に
100×100のビューを表示しております。
ここで、
100×100のビューをタップしたら、
300×300にビューの大きさを変更し、
マップビューを
100×100の大きさにして、
ビューとマップビューの前後を変更(マップビューをビューの上に描画)したいのですが、
100×100のビューをタップすると、ビューが消えてしまい、マップビューの大きさも変わりません。
この状態から、マップビューを300×300の状態をタップすると100×100のビューが表示されます(おそらくきちんと動作している)。
実現したいことは、ビューとマップビューの小さい方をタップすると、タップされた方を拡大して後ろ側に、されていない方が小さくなって前面に来る。ということを実現したいです。
###発生している問題・エラーメッセージ
bringSubviewToFrontとsendSubviewToBackが上手く機能しない
###該当のソースコード
swift
1 @IBOutlet weak var parentView: UIView! // 親 2 @IBOutlet weak var mapView : MKMapView! // マップ 3 @IBOutlet weak var childView : UIView! // ビュー 4 5 /// 画面表示直前に呼ばれる 6 override func viewWillAppear(animated : Bool) { 7 super.viewWillAppear(animated) 8 9 // 親ビューの子供に設定 10 self.parentView.addSubview(self.mapView) 11 self.parentView.addSubview(self.childView) 12 } 13 14 // マップビュー拡大(正しく動いている?) 15 @IBAction func ChangeMapView(sender: AnyObject) { 16 self.mapView.frame = CGRect(x: 0, y: 0, width: 300, height: 300) 17 self.childView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 18 self.parentView.sendSubviewToBack(self.mapView) 19 self.parentView.bringSubviewToFront(self.childView) 20 } 21 22 // ビュー拡大(ビューが消える) 23 @IBAction func ChangeChildView(sender: AnyObject) { 24 self.childView.frame = CGRect(x: 0, y: 0, width: 300, height: 300) 25 self.mapView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 26 self.parentView.sendSubviewToBack(self.childView) 27 self.parentView.bringSubviewToFront(self.mapView) 28 }
###試したこと
大きさがかぶっているため表示されないのかと思い、ビューの大きさを変更して400×400等にしたが、表示がされない。
parentViewを使用せず、最初からあるself.viewにmapViewとchildViewをaddChildしてみたりしたが、挙動に変更がありませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
swift2.3
Xcode7.3.1
アドバイスを受け修正したコードになります。
swift
1@IBAction func ChangeMapView(sender: AnyObject) { 2 self.mapView.frame = CGRect(x: 100, y: 1, width: 400, height: 400) 3 self.childView.frame = CGRect(x: 1, y: 1, width: 200, height: 200) 4 self.parentView.bringSubviewToFront(self.childView) 5} 6 7@IBAction func ChangeChildView(sender: AnyObject) { 8 self.childView.frame = CGRect(x: 1, y: 1, width: 400, height: 400) 9 self.mapView.frame = CGRect(x: 1, y: 1, width: 200, height: 200) 10 self.parentView.bringSubviewToFront(self.mapView) 11}
###解決したコード
swift
1// 親のビュー 2@IBOutlet weak var parentView: UIView! 3 4// 描画順を変更したいビュー 5var mapView : MKMapView! = MKMapView() 6var childView : UIView! = UIView()
swift
1 2override func viewWillAppear(animated : Bool) { 3 super.viewWillAppear(animated) 4 5 // サブビューに追加 6 parentView.addSubview(self.mapView) 7 parentView.addSubview(self.childView) 8 9 // 大きさの初期値 10 self.mapView.frame = CGRect(x: 0,y: 0,width: 100,height: 100) 11 self.childView.frame = CGRect(x: 110,y: 0,width: 100,height: 100) 12 13 // タップできるようにする 14 self.mapView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(ChangeMapView))) 15 self.childView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(ChangeChildView))) 16}
swift
1// childViewを縮小して前面に 2func ChangeMapView(sender: AnyObject) { 3 self.mapView.frame = CGRect(x: 100, y: 1, width: 400, height: 400) 4 self.childView.frame = CGRect(x: 1, y: 1, width: 200, height: 200) 5 self.parentView.bringSubviewToFront(self.childView) 6} 7 8// mapViewを縮小して前面に 9func ChangeChildView(sender: AnyObject) { 10 self.childView.frame = CGRect(x: 1, y: 1, width: 400, height: 400) 11 self.mapView.frame = CGRect(x: 1, y: 1, width: 200, height: 200) 12 self.parentView.bringSubviewToFront(self.mapView) 13}
回答1件
あなたの回答
tips
プレビュー