호댕의 iOS 개발

[iOS] 다이나믹 아일랜드 상단까지 View가 꽉 차지 않는다? 본문

Software Engineering/iOS

[iOS] 다이나믹 아일랜드 상단까지 View가 꽉 차지 않는다?

호르댕댕댕 2023. 6. 23. 10:03

다이나믹 아일랜드가 있는 iPhone 14 Pro와 iPhone 14 Pro Max의 경우 아래 이미지처럼 다이나믹 아일랜드 상단에 공간이 생기게 되었다.

 

 

일단 기존에는 노치 부분까지 화면에 꽉 채우기 위해 StatusBar의 높이만큼 collectionView의 contentInset.top을 음수로 줘서 위로 올라가도록 구현했었다. 

 

let statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

collectionView.contentInset.top = -statusBarHeight

여기서 statusBarManager의 경우 iOS 13부터 사용이 가능한 프로퍼티이다.

 

하지만 다이나믹 아일랜드가 생기면서 statusBar보다 위 공간이 더 생기게 되었다. 

 

let topPadding = window?.safeAreaInsets.top ?? 0

그래서 safeAreaInsets.top을 사용해보았다. 

이렇게 하니 다이나믹 아일랜드의 윗 부분까지 꽉 차도록 변경이 되었다. 

 

이렇게 이 문제는 해결이 된 줄 알았다...

 

현재 화면 우측 상단에 있는 검색 / 설정 / 알림 버튼 또한 window?.safeAreaInsets.top 만큼 Inset을 더 줘서 레이아웃을 잡아줬었다. 

 

하지만 이렇게 하니 해당 값이 잘못 연산이 되는지 간헐적으로 해당 버튼 스택들이 스테이터스 바를 침범하게 되는 문제가 있었다. 

흠... 항상 문제가 생기는 것은 아니고 아주 가끔 잘못된 값을 넣는지 문제가 생겼다. 

 

(문제가 항상 발생하는 것은 아니다보니 디버깅이 어려웠다... ...)

 

따라서 일단 StatusBar의 높이와 SafeAreaInsets.Top을 비교해서 큰 값을 Padding으로 사용하도록 코드 수정을 해놓았다. 

let topSafeAreaInset = window?.safeAreaInsets.top ?? 0
let statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

if topSafeAreaInset >= statusBarHeight {
    topPadding = topSafeAreaInset

    return
}

topPadding = statusBarHeight

아이패드의 경우 일단 노치가 없기 때문에  항상 StatusBar의 높이를 Top Padding으로 갖도록 구현했고 iPhone의 경우 StatusBar의 높이와 SafeAreaInsets.Top을 비교하는 로직을 추가해 Top Padding을 설정할 수 있도록 했다. 

 

(iPhone 14 Pro와 iPhone 14 Pro Max를 제외하면 정상적으로 연산이 된다는 가정 하에 어차피 이 둘은 항상 동일한 값이 나오게 된다)

 

어떤 상황에서 window?.safeAreaInsets.top 값이 잘못 연산되는지는 찾지 못했다... 

(혹시 아시는 분은 알려주세요...)

Comments