やりたいこと
- TableViewをスクロールさせる時にステータスバーに表示が被らないようにしたい
動作環境
Xcode: 7.3.1
対応方法
- 画面表示時にステータスバーに被らないように初期位置をずらす
- スクロールされたらステータスバーを非表示にする
- 再度最上部までスクロールされたらステータスバーを表示する
プログラム
TableViewの作成については割愛。
UITableViewControllerを継承してCustomTableViewControllerを作ったところから。
初期位置の調整
CustomTableViewController.viewDidLoad
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0)
self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(20, 0, 0, 0)
上記を追加してステータスバー分テーブルビューのスタート位置とスクロール開始位置をずらします。
スクロール時のステータスバー表示非表示の調整
CustomTableViewController
var shouldHideStatusBar: Bool = false
ステータスバーの表示状態を管理するプロパティを作る
CustomTableViewController
override func scrollViewDidScroll(scrollView: UIScrollView) {
shouldHideStatusBar = scrollView.contentOffset.y > 0 ? true : false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return shouldHideStatusBar
}
作ったプロパティをscrollViewDidScrollの中で動的に切り替えます。
scrollView.contentOffset.yがscrollView内の現在のy座標を示します。
ここで設定した値は prefersStatusBarHiddenをoverrideした中で利用しています。
self.setNeedsStatusBarAppearanceUpdate()を呼ぶと、prefersStatusBarHiddenの返り値によってステータスバーの表示非表示が切り替わるので、これでやりたいことが実現できます。