iOS 7からUINavigationControllerの中のUIViewControllerでViewに当てるUIScrollViewはそのコンテンツをBarの高さの程度で下げます。解決する策としては、以下のコードはかなり有名かもしれません。
- (void)viewDidLoad{
[super viewDidLoad];
// iOS7以上の場合
if ([[[UIDevice currentDevice]systemVersion]floatValue]>=7.0) {
// 拡張レイアウトのエッジをクリア
self.edgesForExtendedLayout = UIRectEdgeNone;
// 不透明バーが拡張レイアウトに含まれない
self.extendedLayoutIncludesOpaqueBars = NO;
// ScrollViewのインセット自動調整をしない
self.automaticallyAdjustsScrollViewInsets = NO;
}
}
qiitaで読んだやはりお前らのiOS7対応は間違っている(解説編)という文章が詳しく解説してくれて助かります。Storyboard使えるならStoryboardで設定するのがオススメです、と言われましたけど、私は先輩に全てのことをコードで始末するという癖を染みられてしまいました。ならば、コードの意味をはっきりにすることはできる限りやらせてもらおう。
具体的にいうと、View Controllerの中身のViewは状況によって、上のNavigation Barと下のTab Barの下に潜り込むことが初期設定です。実はそのViewの潜り込むことは二つのBarに分けて、論理的に四つの設定が可能です。本質的なことはその結果的な効果によって、Barの下に潜り込んだViewの部分の色はその上にガラス効果を持ちます。しかし、Table ViewとしてYの値は0からですので、処理もせずにそのまま展示すると、0番目のアイテムはBarに隠されます。そのために、スクロールを支援するView、すなわちUIScrollViewを利用するものは、初期設定でそのコンテンツをBarの高さの程度で下げます。その二つの機能以外、Barが半透明ではない場合には、潜り込むかどうかは設定できます。
考えると、今までそのiOS 7の新しいUIに対応することはよくわからないままでとりあえず正しく展示させることだけを求めていました。反省することも必要ですが、中国語のIT圏でそんな資料は大体コピーしたもので、あるいは結果論ばかりで、皆よくわからないけど役に立てばいいじゃないという態度で技術をやっています。もっと明らかな例は、今まで面接官をやった経験として、接したものは大体アウトソーシング企業出身で、その態度は常態みたいです。最近ようやくそれを認識して、グーグルの言語を日本語に切り替えてしまいました。