7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swiftでスクロールに合わせてStatusBarの表示非表示を切り替える

Posted at

やりたいこと

  • 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の返り値によってステータスバーの表示非表示が切り替わるので、これでやりたいことが実現できます。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?