navigationcontroller.hidesbarsonswipe 왜 다시 안나오나요

김재형·2024년 5월 4일
1
post-custom-banner

navigationcontroller?.hidesbarsonswipe 이슈

LSLP 작업중 제가 작업중인 프로젝트가 SNS 앱이다 보니
네비게이션을 숨기는 것이 사용자 경험(UX)적으로 좋겠구나 라는 생각이 들어서
적용하다 생겼던 이슈를 소개합니다.

hidesbarsonswipe 가 뭔데요?

네비게이션 컨트롤러를 하위뷰의 스크롤뷰를 스크롤 할때 알아서 숨기거나 표시하여 줍니다.

너무 간편한 기능인것 같은데요? 바로 적용해 볼께요

 override func viewDidLoad() {
        super.viewDidLoad()
        homeView.tableView.tableHeaderView = homeView.headerView
        navigationController?.hidesBarsOnSwipe = true
    }

와 정말 잘 되는것 같은데…?????????
왜 다시 네비게이션 바가 돌아 오시지 않는걸까요..?

문서를 살펴보자

hidesBarsOnSwipe | Apple Developer Documentation

속성을 설정하면 true → 위쪽으로 스와이프하면 탐색 모음과 도구 모음이 숨겨집니다. 아래쪽으로 스와이프하면 두 막대가 다시 표시됩니다. 도구 모음에 항목이 없으면 스와이프한 후에도 계속 표시됩니다.
이 속성의 기본값은 false 입니다.


와 역시 애플문서 정말 설명이 친절해서 문제를 바로 발견할수가 있겠어요

도와줘요 스택 오버 플로우!

전혀 문제의 원인이 무엇인지 모르겠어서 나와 같은 문제를 겪고있는 분의 글을 찾았습니다.

Hiding Navigation bar with self.navigationController.hidesBarsOnSwipe = true, hides it permanently

해당 글쓴이도 같은 문제를 겪고있었으니… 답글의 해결 방법인
constraints 를 슈퍼뷰에 하세요” 라는 말을 듣고 적용해 보았는데요!

와 드디어…. 해.ㄱ. 는 무슨..!
내가 바라고 있는 SafeArea 에 여백이 없어요 ㅜㅜ

아 그렇다면…. isHidden으로?

그렇다면 실시간으로 스크롤을 감지하여 구현해 보면 어떻까요?

var current = 5
        
homeView.tableView.rx.willDisplayCell
        
homeView.tableView.rx.didEndDisplayingCell

위에 두 메서드를 통해
새로 나타날 셀(willDisplayCell) 의 indexPath.item 과 didEndDisplayingCell(과거와 현재의 비교) 를
통해 과거 보다 새로 나올 셀이 크다면 히든을 걸거나 풀어버려야 겠다 라는 로직을 구성하였었는데요
아래의 이미지는 그것의 결과인데

하…. 진짜 죄송 해여 잘못했어요 제발 그만 절 힘들게 해주세요…!
이제는 타이틀(커스텀뷰) 만 사라지고 네비게이션 바는 그대로 있는 현상이 발생하게 됩니다....

빈 뷰를 통해 착시를 주어보자

빈뷰를 안전 영역을 대체하게 하여 컬렉션뷰는 그와 별개로 슈퍼뷰에 달아놓는 방법으로
해당 문제를 해결해 보려고합니다.

레이아웃

 override func configureLayout() {
        emptyView.snp.makeConstraints { make in
            make.top.horizontalEdges.equalToSuperview()
            make.bottom.equalTo(safeAreaLayoutGuide.snp.top)
        }
        tableView.snp.makeConstraints { make in
            make.horizontalEdges.bottom.equalTo(safeAreaLayoutGuide)
            make.top.equalToSuperview()
        }
        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = 240
    }

ViewController

   override func viewDidLoad() {
        super.viewDidLoad()
        homeView.tableView.tableHeaderView = homeView.headerView
        navigationController?.hidesBarsOnSwipe = true
    }

결과

세상에 너무 행복해요

드디어…! 제가 원하는 구조인

  • 네비게이션 바가 영구적으로 숨겨지는 문제: 스크롤 다운 후 네비게이션 바가 다시 나타나지 않는 현상
  • SafeArea와의 충돌: 네비게이션 바의 숨김과 표시가 SafeArea를 침범하여 레이아웃 문제 발생
  • 스크롤 동작의 불안정성: 스크롤 동작 중 네비게이션 바의 숨김과 표시가 예상치 않게 발생

3가지 문제를 모두 해결한 구조가 완성 되었습니다 ㅠㅠ

돌아보기

문제가 발생하면 애플 문서를 다시 보는 것도 좋지만 역시 애플문서는
설명이 너무 부실하다는 생각이 문득 드는군요! 하지만 그래도 꼭 한번씩은 들려서
부실할떄 다른 자료 찾으러 가는 패턴을 들이고 있습니다.

이번 이슈에서 다양한 해결책 들을 시도해보면서,
Stack Overflow와 같은 플랫폼에서 다른 개발자들은 비슷한 문제들을,
어떻게 해결했는지 찾아보고, 다른 사람들의 노하우(경험)을 배워 적용해 볼수 있었습니다.
이과정에서 커뮤니티의 중요성을 또다시 느꼈으며, 경험들을 공유함으로써 저의 글도
다른이들에게 기여할수 있다는 점을 깨달았습니다.

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글