반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

SwiftUI launchScreen(splash Image) 만들기 ( delay가 가능한.. ) 본문

오뚝이 개발자/SwiftUI

SwiftUI launchScreen(splash Image) 만들기 ( delay가 가능한.. )

rriver2 2022. 8. 4. 16:01
반응형

 launchScreen vs splash Image 

launchScreen이란 앱의 메인 화면이 나오기 전 로딩 시간에 보여주는 화면이다.

launchScreen)

앱의 로딩시간이 길어 사용자에게 해당 앱이 열리고 있음을 알려주는 시그널 

 

splash Image)

앱 브랜딩을 위해 launching 시간보다 더 오래 .. launchScreen화면을 띄우는 것

-> 애플은 splash Image가 해당 앱이 느리다는 것을 밝히는 일이기 때문에 만드는 것을 지양해야 한다고 하지만, 대부분의 앱의 경우에는 앱 브랜딩을 위해 splash Image가 존재한다. 다만 애니메이션이나 긴 시간의 splash Image가 아니라 1-2초 사이에서 빨리 사라지는 splash Image가 대부분이다. 

 

1️⃣ launch Screen 만들기 

1) command + N을 눌러 새로운 launch Screen을 만든다. (이름은 Launch Screen으로 했다)

 

2) 해당 런치스크린을 꾸민다. (UIKit으로 되어 있기 때문에 어느정도 이해가 필요하다.)

 

+) UIKit을 모르는 사람을 위해... 짧막한 그림 설명

 

3) TarGets -> General -> Launch Screen File을 Launch Screen으로 지정해준다.

 

이렇게 하고 나면 launchScreen은 끗 ! 

 

 


근데.. 너무 빨리 지나가 버려서 아쉬웠다..

2️⃣ launch Screen을 좀 더 오랜시간 보여주기 위해 다음과 같은 코드를 추가했다.

import SwiftUI

// 추가
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        // 원하는 시간만큼 sleep 시키기( 초 단위 )
        Thread.sleep(forTimeInterval: 1)
        return true
    }
}

@main
struct CampairApp: App {
	// 추가
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            TabbarView()
        }
    }
}

하지만 위와 같은 방법은 Thread를 sleep 시키면 아무 작업도 일어나지 않기 때문에 비효율적인 코드이다. 

 

 

그래서 다른 방법을 고민하던 중 다음과 같은 코드를 짰다.

@main
struct CampairApp: App {
    @State var isSplashView = true
    var body: some Scene {
        WindowGroup {
            if isSplashView {
                LaunchScreenView()
                    .ignoresSafeArea()
                    .onAppear {
                        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
                            isSplashView = false
                        }
                    }
            } else {
                TabbarView()
            }
        }
    }
}

struct LaunchScreenView: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> some UIViewController {
        let controller = UIStoryboard(name: "Launch Screen", bundle: nil).instantiateInitialViewController()!
        return controller
    }
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
    }
}

 

 이제 시간이 늘어난 것을 확인할 수 있다 ( 확연한 차이를 보기 위해 4초로 설정해뒀다. )

반응형
Comments