티스토리 뷰
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 를 사용하면 될 것 같습니다.
'iOS' 카테고리의 다른 글
[iOS] URL Scheme vs Universal Link 차이 (deep link?) (2) | 2021.08.23 |
---|---|
[iOS] API Design Guidelines - Naming 애플식 네이밍 (0) | 2021.08.23 |
[Swift] NSCache란? (image cache하기) (0) | 2021.07.21 |
[iOS] MVVM이란? (0) | 2021.05.26 |
[iOS] ARC, weak와 unowned (0) | 2021.05.05 |
댓글
공지사항