본문 바로가기
🍎 iOS

[iOS/Swift] SafeArea 높이 구하기

by 틴디 2023. 2. 5.
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에 제약을 걸어줄 수 있음 

 

Pexels에서 Tom Fisk님의 사진: https://www.pexels.com/ko-kr/photo/2435292/

전체 코드 포함된 깃허브 주소

https://github.com/youabledev/archive/blob/main/Archive/Basic%20Setting/CGRatioSize.swift

 

참고 사이트 및 도서

https://www.hackingwithswift.com/forums/swift/how-to-create-a-value-type-from-uiwindowscene/10485/12271

728x90
반응형

댓글