縦スクロールされたとき、NavigationBarをスッと隠すアニメーション、かっこいいですよね。
コンテンツ表示を広くとれるのでユーザーにとっても嬉しい挙動だと思います。
UITableView等のUIScrollViewを親に持っているViewを使っている場合は以下のように書くだけで簡単に作用します。
delegate
は設定してあると思いますが、確認しておきましょう。※詳しくは後述
ViewController.swift
final class ViewController: UIViewController {
// スクロールでNavigationBarを隠す
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let isBarHidden = scrollView.panGestureRecognizer.translation(in: scrollView).y < 0
navigationController?.setNavigationBarHidden(isBarHidden, animated: true)
}
}
ただし、ScrollViewを使用していない、UIStackViewやUILabel、UIButtonなどだけで構成された画面の場合はもう一手間必要です。
UIScrollViewDelegate
に適合する必要がありますので、以下のように書きましょう。
ViewController.swift
final class ViewController: UIViewController {
// 省略
}
extension ViewController: UIScrollViewDelegate {
// スクロールでNavigationBarを隠す
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let isBarHidden = scrollView.panGestureRecognizer.translation(in: scrollView).y < 0
navigationController?.setNavigationBarHidden(isBarHidden, animated: true)
}
}
追記:delegateの追加の必要な場合もある
例えば、単一のUITextViewで構成されたViewControllerの場合は、delegateを繋いでおく必要がありますのでご注意を。
StoryboardでUITextViewからViewControllerへcontrolボタンを押しながらドラッグし、Outlets
のdelegate
を選べばOKです。
以上です。
参考