프로젝트/택스리펀 계산기

[택스리펀 계산기] 모달 간격 조정에 관한 트러블슈팅

Quaker.Lee 2025. 5. 8. 23:48

 

문제

 

국가를 선택하는 모달창에서, 모달의 첫번째 셀이 상단과 너무 딱 붙어있어서 

 

tableView.contentInset.top = 16

해당코드로 inset 값을 16만큼 주었다.

하지만 모달이 다시 나타날때 여전히 너무 딱 붙어있고,

한번 스크롤 해야지만

 

이런식으로 간격이 정상적으로 벌어지는 현상이 있었다.

 

 

원인

"UISheetPresentationController의 레이아웃 시스템과 UITableView의 초기 콘텐츠 오프셋 동기화 이슈"가 원인이다.

이 문제는 iOS 15 이상에서 UISheetPresentationController를 사용하면서 흔히 발생하는 이슈라고 한다.

 

 

해결

단순한 contentInset 설정만으로는 해결되지 않는 경우가 있고,

정확히 원하는 위치에서 tableView.setContentOffset(_:animated:)까지 호출해주는 조치가 필요하다.

contentInset.top = 16을 설정하면 논리적으로는 셀 위에 여백이 생겨야 하지만,

실제로는 iOS가 초기 레이아웃 계산 시 그 inset 값을 스크롤 위치에 반영하지 않고, 오프셋을 0으로 강제하는 경우가 있다.

그래서 우리는 직접 contentOffset.y = -16으로 이동시켜줘야, inset이 눈에 보이게 적용되는 것이다.

 

private func setupTableView() {
        // 테이블뷰를 뷰에 추가
        view.addSubview(tableView)
        
        // 오토레이아웃 설정
        tableView.snp.makeConstraints {
            $0.edges.equalToSuperview()
        }
        
        // 델리게이트 & 데이터소스 연결
        tableView.delegate = self
        tableView.dataSource = self
        
        // 셀 등록
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "CountryCell")
        
        // Grabber와 첫 번째 셀 사이 간격
        tableView.contentInset.top = 16
        tableView.setContentOffset(CGPoint(x: 0, y: -16), animated: false)
}