본문 바로가기
감정일기(가칭)

🚀 iOS 13+ SceneDelegate: UIWindow 설정, 가장 깔끔하게 끝내기!

by 밤새는 탐험가89 2025. 10. 14.
728x90
SMALL

iOS 13 이후 SceneDelegate가 도입되면서 UIWindow를 설정하는 방식이 훨씬 간결하고 명확해졌습니다.

이전 방식과 최신 방식을 비교하며 UIWindow 설정의 핵심을 정리해 드립니다.


💡 핵심 변화: frame 설정이 사라지다!

과거에는 윈도우의 크기를 직접 지정해야 했지만,

이제는 윈도우가 속할 Scene만 지정해 주면 시스템이 모든 것을 알아서 처리해 줍니다.

 

1. 이전 방식: 번거로운 2단계 설정

SceneDelegate에서 윈도우를 설정할 때, iOS 13 이전의 관습대로 다음 두 단계를 거쳤습니다.

 

크기 설정 (frame:)

window = UIWindow(frame: windowScene.coordinateSpace.bounds)

 

👉 frame: 을 사용해 윈도우의 크기를 현재 화면 전체(bounds)로 지정해야 했습니다.

 

Scene 수동 연결

window?.windowScene = windowScene

 

👉 윈도우를 생성한 후, 이 윈도우가 어떤 Scene에 속하는지 명시적으로 연결해 줘야 했습니다.

 

이 두 코드는 모두 필수적이었지만, windowScene의 경계에 윈도우를 만들 거라면

굳이 frame을 수동으로 지정할 필요가 없다는 의문이 있었습니다.


2. 최신 방식: UIWindow(windowScene:)으로 간결하게! 🎉

iOS 13 이후, Apple은 이 과정을 하나로 합친 새로운 초기화 메서드를 제공했습니다.

guard let windowScene = (scene as? UIWindowScene) else { return }

// 🌟 단 한 줄로 끝!
window = UIWindow(windowScene: windowScene)

 

이 한 줄의 코드는 이전의 두 가지 필수 작업을 동시에 처리합니다

 

🔑 요약: 코드가 개선된 이유

UIWindow(windowScene:)는 iOS Scene 기반 구조에 최적화된 초기화 방식입니다.

 

시스템이 윈도우가 속한 Scene을 인지하고 자동으로 크기를 관리하도록 함으로써,

특히 iPad의 멀티태스킹 환경에서 윈도우의 수명 주기와 크기 조정(Resizing)을

더 정확하고 안정적으로 처리할 수 있게 됩니다.


📝 최종 SceneDelegate 설정 (예시)

결론적으로, SceneDelegate에서 프로그래밍 방식으로 UI를 설정하는 가장 깔끔한 방법은 다음과 같습니다.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
    // 1. Scene 가져오기 (필수)
    guard let windowScene = (scene as? UIWindowScene) else { return }
    
    // 2. 윈도우 생성 및 Scene 연결 (✨ 최신 방식)
    window = UIWindow(windowScene: windowScene)
    
    // 3. 루트 뷰 컨트롤러 설정
    let rootVC = ViewController()
    let navigationController = UINavigationController(rootViewController: rootVC)
    
    self.window?.rootViewController = navigationController
    
    // 4. 화면에 표시 (필수)
    window?.makeKeyAndVisible()
}
728x90
LIST