프로젝트/택스리펀 계산기
[택스리펀 계산기] 모달 간격 조정에 관한 트러블슈팅
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)
}