

_（指摘を受けて編集しています）_

現在、UINavigationControllerを使ってiOSの開発を行っています。
ややトリッキーな使い方ではありますが、UINavigationControllerで普通に生成されたビューの中に、
さらに「UINavigationController > UIViewController >
UITableView」という構造を持ったものを表示しようとしています。

具体的には、UINavigationControllerで表示されたビューに対し、
UINavigationBar上のボタンを押下された際に以下のように処理しています。

  1. UIViewを継承したカスタムViewを生成（HogePopupView）
  2. UINavigationControllerを生成
  3. (2)に表示するカスタムViewControllerを生成
  4. (3)をrootに`initWithRootViewController:`を呼び出す
  5. (1)のviewを、生成元のviewControllerのviewにaddSubviewする

※ storyboardは一切使っていません。

**設計の思惑としては、単純にカスタムのUIViewを生成してaddSubviewするだけで使えるようにしたい、というものです。**

カスタムviewの目的としては、現在表示されているビューの上にオーバーレイする形で 画面全体からやや小さい、ポップアップのビューを表示したいと考えています。

iOS7, iOS8では特に問題なく表示されているのですが、なぜかiOS6のみ、 上記のUITableViewが20px（おそらくStatus
bar分）上にずれる、という現象が発生しています。
ビューが表示されたあと（viewWillAppearなど）に位置を変更する処理を入れてもなぜか変更されません。
（具体的には、UITableViewの引っ張って更新が出てくる上端がUINavigationBarが少し重なっている状態です）

こうして入れ子にした場合に起こる挙動の違いはなにが考えられるでしょうか？
（個人的にはUINavigationControllerの挙動として、自動的にステータスバーを考慮した補正がかかるのでは、と思っています）

だいぶ抽象的な質問ですみません。

[追記] 実装上の問題としては解決しました。 （UINavigationBar側を逆に上にずらした）
ただ、本質的な改善にはなっていないので、見た目の整合性を取った、という感じです。


CC BY-SA 3.0
2014-12-06T05:40:01.533
396
2014-12-08T05:39:13.987
2014-12-08T01:01:04.880
100
100
question
ios objective-c ios6 uinavigationcontroller
iOS6でのみ、UINavigationControllerの入れ子で最初のsub viewの位置がずれる


コードを再現できないので、本当に解決できるかどうかはわかりませんが、  
親のUIViewControllerにaddSubViewする前に、以下のように[addChildViewController](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/addChildViewController:)を呼び出すとどうなりますか？

[code]

    [self addChildViewController:childVC];
    [childVC didMoveToParentViewController:self];
    [mainView addSubview:childVC.view];
    
[/code]

英語版でも同じような質問はあって、addChildViewControllerを呼び出すと直った、というようなコメントがありました。

  * [UIViewController's view has weird 20px y margin](https://stackoverflow.com/q/11252395/718426)

addChildViewControllerが何をやっているかですが、この質問がわかりやすいかなと思います。

  * [What does addChildViewController actually do?](https://stackoverflow.com/q/17192005/718426)

[正解とされている回答](https://stackoverflow.com/a/18453401/718426)によれば、addChildViewControllerがやることはそう多くなくて、あるUIViewControllerの子であると宣言することで、様々なイベントの情報が通知されるようになる、とのことです。

//できれば、github等々にコードを貼ってもらえると追試が楽です。


CC BY-SA 3.0
2014-12-08T05:39:13.987
442
2014-12-08T05:39:13.987
2017-05-23T12:38:55.250
-1
351
396
answer