質問編集履歴

4 コメント修正

_utah

_utah score 14

2017/02/28 19:38  投稿

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

    8754 questions

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

  • Swift 2

    1339 questions

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

3 解決したコードを追加

_utah

_utah score 14

2017/02/28 19:36  投稿

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

    8754 questions

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

  • Swift 2

    1339 questions

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

2 コードの追記

_utah

_utah score 14

2017/02/28 17:47  投稿

view同士の描画順の入れ替えが上手くいかない
###前提・実現したいこと
300×300のマップビューの上に
100×100のビューを表示しております。
ここで、
100×100のビューをタップしたら、
300×300にビューの大きさを変更し、
マップビューを
100×100の大きさにして、
ビューとマップビューの前後を変更(マップビューをビューの上に描画)したいのですが、
100×100のビューをタップすると、ビューが消えてしまい、マップビューの大きさも変わりません。
この状態から、マップビューを300×300の状態をタップすると100×100のビューが表示されます(おそらくきちんと動作している)。
実現したいことは、ビューとマップビューの小さい方をタップすると、タップされた方を拡大して後ろ側に、されていない方が小さくなって前面に来る。ということを実現したいです。
###発生している問題・エラーメッセージ
```
bringSubviewToFrontとsendSubviewToBackが上手く機能しない
```
###該当のソースコード
```swift
   @IBOutlet weak var parentView: UIView!       // 親
   @IBOutlet weak var mapView : MKMapView! // マップ
   @IBOutlet weak var childView : UIView!        // ビュー
   /// 画面表示直前に呼ばれる
   override func viewWillAppear(animated : Bool) {
       super.viewWillAppear(animated)
       
       // 親ビューの子供に設定
       self.parentView.addSubview(self.mapView)
       self.parentView.addSubview(self.childView)
   }
   // マップビュー拡大(正しく動いている?)
   @IBAction func ChangeMapView(sender: AnyObject) {
       self.mapView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
       self.childView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
       self.parentView.sendSubviewToBack(self.mapView)
       self.parentView.bringSubviewToFront(self.childView)
   }
   
   // ビュー拡大(ビューが消える)
   @IBAction func ChangeChildView(sender: AnyObject) {
       self.childView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
       self.mapView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
       self.parentView.sendSubviewToBack(self.childView)
       self.parentView.bringSubviewToFront(self.mapView)
   }
```
###試したこと
大きさがかぶっているため表示されないのかと思い、ビューの大きさを変更して400×400等にしたが、表示がされない。
parentViewを使用せず、最初からあるself.viewにmapViewとchildViewをaddChildしてみたりしたが、挙動に変更がありませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
swift2.3
Xcode7.3.1
![イメージ説明](629368124fde45c48d096b5e0a1a37b0.png)
![イメージ説明](629368124fde45c48d096b5e0a1a37b0.png)
アドバイスを受け修正したコードになります。
```swift
@IBAction func ChangeMapView(sender: AnyObject) {
   self.mapView.frame = CGRect(x: 100, y: 1, width: 400, height: 400)
   self.childView.frame = CGRect(x: 1, y: 1, width: 200, height: 200)
   self.parentView.bringSubviewToFront(self.childView)
}
@IBAction func ChangeChildView(sender: AnyObject) {
   self.childView.frame = CGRect(x: 1, y: 1, width: 400, height: 400)
   self.mapView.frame = CGRect(x: 1, y: 1, width: 200, height: 200)
   self.parentView.bringSubviewToFront(self.mapView)
}
```
  • Swift

    8754 questions

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

  • Swift 2

    1339 questions

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

1 階層がわかりにくいので、画像追加

_utah

_utah score 14

2017/02/27 21:09  投稿

view同士の描画順の入れ替えが上手くいかない
###前提・実現したいこと
300×300のマップビューの上に
100×100のビューを表示しております。
ここで、
100×100のビューをタップしたら、
300×300にビューの大きさを変更し、
マップビューを
100×100の大きさにして、
ビューとマップビューの前後を変更(マップビューをビューの上に描画)したいのですが、
100×100のビューをタップすると、ビューが消えてしまい、マップビューの大きさも変わりません。
この状態から、マップビューを300×300の状態をタップすると100×100のビューが表示されます(おそらくきちんと動作している)。
実現したいことは、ビューとマップビューの小さい方をタップすると、タップされた方を拡大して後ろ側に、されていない方が小さくなって前面に来る。ということを実現したいです。
###発生している問題・エラーメッセージ
```
bringSubviewToFrontとsendSubviewToBackが上手く機能しない
```
###該当のソースコード
```swift
   @IBOutlet weak var parentView: UIView!       // 親
   @IBOutlet weak var mapView : MKMapView! // マップ
   @IBOutlet weak var childView : UIView!        // ビュー
   /// 画面表示直前に呼ばれる
   override func viewWillAppear(animated : Bool) {
       super.viewWillAppear(animated)
       
       // 親ビューの子供に設定
       self.parentView.addSubview(self.mapView)
       self.parentView.addSubview(self.childView)
   }
   // マップビュー拡大(正しく動いている?)
   @IBAction func ChangeMapView(sender: AnyObject) {
       self.mapView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
       self.childView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
       self.parentView.sendSubviewToBack(self.mapView)
       self.parentView.bringSubviewToFront(self.childView)
   }
   
   // ビュー拡大(ビューが消える)
   @IBAction func ChangeChildView(sender: AnyObject) {
       self.childView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
       self.mapView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
       self.parentView.sendSubviewToBack(self.childView)
       self.parentView.bringSubviewToFront(self.mapView)
   }
```
###試したこと
大きさがかぶっているため表示されないのかと思い、ビューの大きさを変更して400×400等にしたが、表示がされない。
parentViewを使用せず、最初からあるself.viewにmapViewとchildViewをaddChildしてみたりしたが、挙動に変更がありませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
swift2.3
Xcode7.3.1
Xcode7.3.1
![イメージ説明](629368124fde45c48d096b5e0a1a37b0.png)
  • Swift

    8754 questions

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

  • Swift 2

    1339 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る