2014年11月17日

全画面対応とスクロールAuto Layout にしているのに topLayoutGuide が 0

iOS7 以降で、Auto Layoutを使って全画面対応をやろうとした時、必ず引っかかりそうなのが、topLayoutGuide の取り方。

ちょうど、Swift - tableview チュートリアル で、御誂え向きの現象が現れたので、Swift で解決してみましょう。Objective-Cでも基本的に同じ。

チュートリアル最後の実行画面(図1)は、全画面対応のためにステイタスバーとtable view のスクロール領域が重なっています。
sw_table_in_simu.png
図1 シミュレーター実行画面

これを希望通りに直す正当方って、ないんだろうか?って、話。


Auto Layout 使っているので、ViewController のtopLayoutGuideを使いたい。でもviewDidLoad やviewWillAppearで topLayoutGuide.length を取ろうとすると常に「0」で困った方いらっしゃいませんか?
IBではちゃんと適正な位置を表示しているのに。。。

実は、この値は継承したviewDidLayoutSubviewsメソッドの中で使わないと、正しい値が得られないのです。

ということで、全画面対応でスクロール位置を調整する時は、次のメソッドをViewControllerに実装します。

override func viewDidLayoutSubviews() {
var len: CGFloat = self.topLayoutGuide.length;
self.tableView.contentInset = UIEdgeInsets(top: len,left: 0,bottom: 0,right: 0)
}


これで、希望の位置にスクロール内容が移動しました。(図2)
scroll_inset_correction.png
図2 self.topLayoutGuide.lengthでコンテンツ位置を調整した結果


posted by ayagu at 16:47| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。