SafeAreaRegions

평소에는 뷰의 밑에 붙어 있다가, 키보드가 나오면 키보드의 위에 찰싹 달라 붙어 있는 바를 만드려고했다. UIKit에서는 NotificationCenter로 이벤트를 받아서 직접 frame을 계산하거나 KeyboardLayoutGuideline를 이용해서 constraint를 이용하기에 당연히 swiftUI에도 비스무리한 기능이 있겠거니 해서 하루 죙일 구글링 해봤지만 나오지 않았다. 반포기 상태로 실기기에서 돌려봤는데 딱히 아무것도 하지 않았는데도, 만들어둔 바가 키보드가 나오자 찰싹 달라 붙어서 매우 허탈. 조금 조사해보니 safeArea와 관련된 문제였다.

safeArea는 뭔지 알테니 생략하고.. swiftUI에서 보통 ignoreSafeArea()를 통해 View의 위치하는 곳을 조정 할 수 있다. 이때 region으로 3가지 옵션이 제공된다.

  • all
  • container
  • keyboard

일단 ignoreSafeArea를 적용하지 않는다면 swiftUI에서의 safeArea는 다음과 같아진다.

키보드가 올라가면 그만큼 safeArea의 bottom부분이 올라온다. 따라서 하단 바가 자동으로 올라가는 것.

 

keyboard

키보드의 safeArea를 무시한다. 키보드가 올라와도 safeArea가 올라가지 않는다는 뜻. safeArea의 bottom이 올라가지 않았으니 키보드가 하단 바를 가리게 된다.

container

top, bottom까지 safeArea의 영역이 확장 됨. 하지만 NavigationBar는 기존 safeArea 영역에 고정되어 있음. 

이때 키보드가 올라오면 키보드의 높이만큼 safeArea의 bottom이 올라오게 됨. 

all

위 두게를 둘 다 합친 것. 스크린의 top, bottom까지 safeArea가 확장되고, 키보드가 올라와도 safeArea가 줄어들지 않는다.

 

ignoreSafeArea를 적용할때는 최상단 부모 뷰에 적용을 해야지 적용 된다. 단 NavigationStack같이 safeArea가 고정 되있는 뷰에 적용은 안되니 이 점을 주의해야한다.