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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

4573閲覧

view同士の描画順の入れ替えが上手くいかない

_utah

総合スコア20

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/02/27 11:50

編集2017/02/28 10:38

###前提・実現したいこと

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}

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

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

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

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

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

fuzzball

2017/02/28 01:07 編集

(deleted)
guest

回答1

0

ベストアンサー

swift

1// 親ビューの子供に設定 2self.parentView.addSubview(self.mapView) 3self.parentView.addSubview(self.childView)

Storyboardで配置しているのですから、このコードは必要ないのでは?
画面に見えているのはコードで追加したViewで、タップした時にサイズ/優先を変更しているのはStoryboardで配置したViewになっていると思います。

おまけ

上に来るViewを最前面に表示させればいいのでself.view.sendSubviewToBack()は不要です。

おまけ2

タップ時はフラグを変更してレイアウト更新を依頼する。
実際のレイアウト変更はviewDidLayoutSubviews()で行う。

この方法だと、Storyboardを使っていても大丈夫だと思います。

swift

1var isMap = true 2 3override func viewDidLayoutSubviews() { 4 super.viewDidLayoutSubviews() 5 6 if isMap { 7 //childを縮小して上に、mapは拡大 8 } else { 9 //mapを縮小して上に、childは拡大 10 } 11} 12 13@IBAction func ChangeMapView(sender: AnyObject) { 14 isMap = true 15 self.view.setNeedsLayout() 16} 17 18@IBAction func ChangeChildView(sender: AnyObject) { 19 isMap = false 20 self.view.setNeedsLayout() 21}

投稿2017/02/27 23:50

編集2017/02/28 09:09
fuzzball

総合スコア16731

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

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

_utah

2017/02/28 08:21

返信が遅れて申し訳ありません。 動作確認のため、ビューとマップをそれぞれ100×100の値に設定し、横に並べたものを初期表示としました。 上記を参考に以下のように書き換えてみたところ、 初期表示→マップタップでマップを後ろに、ビューを前に ◯ 初期表示→ビュータップでビューを後ろに、マップを前に ◯ はできたのですが、 初期位置ではない状態(ボタンをタップしサイズ/優先が変更された)でいずれかをタップをすると、初期表示に戻ってしまいます。 原因わかりますでしょうか。
_utah

2017/02/28 08:44 編集

以下変更したコードです ※追記欄にコードを移動させました。
fuzzball

2017/02/28 08:25 編集

おそらく、Viewのサイズを変更してレイアウトが更新されるときにStoryboardの状態に戻っているんだと思います。Storyboardでの配置をやめて、コードで生成&配置すればいいのですが、今のままStoryboardを使った方がいいですか? ※コードはここではなく質問内に書いて下さい。
_utah

2017/02/28 08:43

ストーリーボードでの配置ではなく、コードで配置して試してみます。 ストーリーボードで行っていた理由としては、元々ストーリーボードで行っていたものに処理を追加していたということだけですので、ストーリーボードにこだわっているということはありません。 ※コードはここではなく質問内に書いて下さい。 →承知いたしました。追記という形で書かせていただきます。
_utah

2017/02/28 09:02

コードで配置してみたところ、きちんと動作致しました。 ご教授ありがとうございます。 コードを綺麗にして、追記しておきます。
fuzzball

2017/02/28 09:11 編集

入れ違いになっちゃいましたが、おまけ2を書きましたので参考にして下さい。
_utah

2017/02/28 10:21

ありがとうございます。 ストーリーボードをどうしても使用しなければいけないことが発生した場合、参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問