728x90
반응형
viewController의 view
view.safeAreaInsets.top
view.safeAreaInsets.bottom
0.0
0.0
20.0
- viewDidLoad, viewWillAppear, viewDidAppear에서 각각 view의 safeAreaInsets으로 접근한 top의 결과 viewDidAppear에서 정확한 값을 얻을 수 있음
- 대부분 UI를 viewDidLoad에서 준비하므로, viewDidAppear에서 필요한 상황이 아닌 경우 정확한 safeArea의 높이를 구하기 어려움
UIApplication.shared.windows.first
- iOS 15.0 미만 버전에서 사용가능
UIApplication.shared.windows.first?.safeAreaInsets.top
UIApplication.shared.windows.first?.safeAreaInsets.bottom
UIApplication.shared.connectedScenes.first
- 여러개의 Sccene을 가지는 경우가 있으므로 이를 대응하기 위해 현재 연결된 connectedScenes의 값으로 UIWindowScene의 정보를 가져오고 이 값으로 windows의 정보를 얻을 수 있음
(UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first?.safeAreaInsets.top
(UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first?.safeAreaInsets.bottom
- 한줄로 작성할 수도 있고 아래와 같이 코드를 나눌 수도 있음 (전역 선언이라 lazy var이 붙음)
/// the origin : https://www.hackingwithswift.com/forums/swift/how-to-create-a-value-type-from-uiwindowscene/10485/12271
let scenes = UIApplication.shared.connectedScenes
lazy var windowScenes = scenes.first as? UIWindowScene
lazy var window = windowScenes?.windows.first
/// Get SafeArea Top Height
lazy var safeAreaTopHeight = window?.safeAreaInsets.top ?? 0.0
- connectedScenes는 iOS 13.0 부터 사용 가능하므로 타겟 버전이 13.0 이상인 경우 해당 코드로 사용하면 됨
만약 버전 별로 분기하고 싶다면
/// under iOS 15.0
private var statusTopHeight: CGFloat? {
guard #available(iOS 15, *) else {
return UIApplication.shared.windows.first?.safeAreaInsets.top
}
return (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first?.safeAreaInsets.top
}
/// under iOS 15.0
private var statusBottomHeight: CGFloat? {
guard #available(iOS 15, *) else {
return UIApplication.shared.windows.first?.safeAreaInsets.bottom
}
return (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first?.safeAreaInsets.bottom
}
SnapKit
view.addSubview(navigationView)
navigationView.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.top.equalTo(view.safeAreaLayoutGuide.snp.top) // ⭐️
make.height.equalTo(48)
}
- 스냅킷을 사용해서 쉽게 safeArea에 제약을 걸어줄 수 있음
전체 코드 포함된 깃허브 주소
https://github.com/youabledev/archive/blob/main/Archive/Basic%20Setting/CGRatioSize.swift
참고 사이트 및 도서
728x90
반응형
'🍎 iOS' 카테고리의 다른 글
[iOS/Swift] Firebase Remote Notification 정리 (0) | 2023.03.08 |
---|---|
[iOS/Swift] Localization 코드로 다국어 처리 (0) | 2023.02.23 |
[iOS/Swift] UIDevice 버전, UUID, 기기 정보 가져오기 (0) | 2023.02.04 |
[iOS/Swift] infoDictionary 앱 버전, 번들 아이디 가져오기 (0) | 2023.02.04 |
[iOS/Swift] 싱글톤 객체 생성 Singleton (0) | 2023.02.04 |
댓글