적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] LaunchScreen duration 이미지 및 노출 시간 설정

hongssup_ 2021. 6. 17. 18:05
반응형

info.plist

Launch screen interface file base name 키 추가

Value에 LaunchScreen 입력. 

 

우리가 흔히 쓰는 application(_:didFinishLaunchingWithOptions:) 메서드가 바로 launch screen과 함께 앱이 로딩될 때 실행되는 구문으로, 앱이 시작되는 순간 필요한 initialization code 들을 이 메서드 안에 작성할 수 있다. 

 

Launch Screen 디스플레이 시간 조정

Thread.sleep(forTimeInterval: 3.0)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...
    sleep(1)
    return true
}

위와같은 방법은 앱 자체를 딜레이 시키므로 좋지 않다. 

따라서 다음과 같이 DispatchQueue를 이용하여 비동기로 뷰컨트롤러를 실행시키는 것이 죠음. 

DispatchQueue.main.async {
    self.requestServerStauts()
    
    self.moveVC(nibName: "AnimationLaunchScreenViewController")
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        self.moveVC(nibName: "WebViewController")
    }
}

AppDelegate에서 작업할 경우

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
        window?.makeKeyAndVisible()

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
            self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
        }
        return true
    }

SceneDelegate에서 작업할 경우

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    window?.rootViewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
    window?.makeKeyAndVisible()

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
        self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
    }

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

 

+ LaunchScreen 실행 후 UINavigationController로 넘겨줄 때는 다음과 같이 적용할 수 있다. 

window?.rootViewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.4) {
    let vc = WebViewController(nibName: "ViewController", bundle: nil)
    let navigationController = UINavigationController(rootViewController: vc)
    navigationController.navigationBar.isHidden = true
    self.window?.rootViewController = navigationController
    //self.moveVC(xibName: "ViewController")
}
return true

 

혹은

func moveVC(nibName : String) {
    if nibName == "WebViewController" {
        let webVC = WebViewController(nibName: nibName, bundle: nil)
        let navigationController = UINavigationController(rootViewController: webVC)
        navigationController.navigationBar.isHidden = true
        self.window?.rootViewController = navigationController
    } else if nibName == "LaunchScreen" {
        self.window?.rootViewController = UIStoryboard(name: nibName, bundle: nil).instantiateInitialViewController()
    }
    self.window?.makeKeyAndVisible()
}

이런식으로 함수를 선언해두고 didFinishLaunchingWithOptions에서 다음과 같이 사용할 수도 있다. 

self.moveVC(nibName: "LaunchScreen")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.7) {
    self.moveVC(nibName: "WebViewController")
}

 

 

참고 : Soda_앱의 시작화면, StackOverflow_How to delay launch screen

728x90
반응형