티스토리 뷰

extension으로 다음과 같이 만들어 줍니다.

extension UINavigationController {
    
    // 완전 안보임
    func hideNavigationBar() {
        navigationBar.isHidden = true
    }
    
    // 투명하게 만들기 (버튼 등은 보임)
    func changeNavigationBar(isClear: Bool) {
        navigationBar.isHidden = false
        if isClear {
            navigationBar.shadowImage = UIImage()
            navigationBar.setBackgroundImage(UIImage(), for: .default)
        } else {
            navigationBar.shadowImage = nil
            navigationBar.setBackgroundImage(nil, for: .default)
        }
    }
}

 

1. 기본적으로 설정되어있는 네비게이션 상태

 

 

2. Navigation 투명하게 처리

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.changeNavigationBar(isClear: true)
    title = "ClearBarViewController"
}

 

3. 원상태로 돌리기

override func viewWillAppear(_ animated: Bool) {
    navigationController?.changeNavigationBar(isClear: false)
    title = "NonClearBarViewController"
}

 

4. 네비게이션바 숨기기

회색뷰의 위치가 기존 네비게이션 자리보다 올라간 것을 볼 수 있습니다.

버튼, title등이 적용되지 않습니다.

BackButton을 따로 구현해야합니다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.hideNavigationBar()
    title = "HideViewController"
}

@IBAction func backButtonTapped(_ sender: Any) {
    navigationController?.popViewController(animated: true)
}

 

 

Navigation 쓸어서 Pop 안되게 설정하기

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

 

setNavigationBarHidden vs navigationBar.isHidden = true

setNavigationBarHidden으로 숨길 경우 interactivePopGestureRecognizer이 안됩니다.(쓸어서 pop하기)

 

쓸어서 Pop 가능하게 만들기

class SetHiddenViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        navigationController?.setNavigationBarHidden(true, animated: true)
        navigationController?.interactivePopGestureRecognizer?.delegate = self
    }
    
    @IBAction func backButtonTapped(_ sender: Any) {
        navigationController?.popViewController(animated: true)
    }
    

}

extension SetHiddenViewController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let nav = navigationController,
           nav.isNavigationBarHidden && nav.viewControllers.count > 1 {
            return true
        }
        return false
    }
}

 

화면전환 차이

1. navigationBar.isHidden 일 때, 화면 전환

 

2. navigationController?.setNavigationBarHidden(true, animated: true) 일 때, 화면 전환

animated: false로하면 위랑 똑같아짐

 

 

상황에 맞게 isHidden, setNavigationBarHidden 를 사용하면 될 것 같습니다.

댓글
공지사항