[swift] Swift 앱에서 동적 런치 이미지 사용하기

iOS 앱을 개발할 때, 앱을 실행할 때 먼저 표시되는 런치 이미지는 앱의 사용자 경험을 개선하는 데 중요한 역할을 합니다. 기본적으로, iOS는 LaunchScreen.storyboard 파일을 사용하여 런치 이미지를 구성합니다. 하지만, 정적인 이미지만을 사용하는 것이 아니라 동적인 이미지를 사용할 필요가 있는 경우가 있습니다.

동적 런치 이미지를 사용하는 방법을 알아보겠습니다.

1. 이미지 준비하기

동적 런치 이미지를 사용하기 위해서는 먼저 이미지를 준비해야 합니다. 보통은 앱에서 표시할 이미지를 서버나 인터넷에서 가져와야 하는 경우가 많습니다. 이 예시에서는 서버에서 이미지를 다운로드하여 사용하는 방법을 보여드리겠습니다.

guard let url = URL(string: "http://example.com/launch_image.png") else {
    return
}

let task = URLSession.shared.dataTask(with: url) { (data, _, _) in
    guard let data = data,
          let image = UIImage(data: data) else {
        return
    }

    // 이미지를 로컬에 저장하고 적용하는 작업 실행
    self.saveAndApplyLaunchImage(image)
}

task.resume()

위의 코드에서 http://example.com/launch_image.png는 실제 이미지의 URL로 대체되어야 합니다. URLSession.shared.dataTask(with:completionHandler:) 함수를 사용하여 해당 URL에서 데이터를 비동기적으로 가져옵니다. 데이터를 성공적으로 가져오면 UIImage로 변환하여 사용하면 됩니다.

2. 런치 이미지 저장 및 적용하기

데이터를 가져오고 UIImage를 얻었다면, 이제 이미지를 로컬에 저장하고 적용하는 작업을 수행해야 합니다. 일반적으로 Document 디렉토리에 이미지를 저장하여 이후에 앱 실행 시에 사용할 수 있도록 합니다.

func saveAndApplyLaunchImage(_ image: UIImage) {
    guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
        return
    }

    let fileURL = documentsDirectory.appendingPathComponent("launch_image.png")
    do {
        try image.pngData()?.write(to: fileURL)
    } catch {
        print("Failed to save launch image: \(error)")
    }

    // 새로운 이미지를 런치스크린에 적용
    DispatchQueue.main.async {
        self.setLaunchImage(fileURL)
    }
}

func setLaunchImage(_ fileURL: URL) {
    guard let imageData = try? Data(contentsOf: fileURL),
          let image = UIImage(data: imageData) else {
        return
    }

    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFill
    imageView.translatesAutoresizingMaskIntoConstraints = false

    if let existingImageView = self.view.subviews.first(where: { $0 is UIImageView }) {
        existingImageView.removeFromSuperview()
    }

    self.view.addSubview(imageView)
    NSLayoutConstraint.activate([
        imageView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
        imageView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
        imageView.topAnchor.constraint(equalTo: self.view.topAnchor),
        imageView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
    ])
}

saveAndApplyLaunchImage(_:image:) 메소드에서는 이미지를 Document 디렉토리에 저장하고, setLaunchImage(_:fileURL:) 메소드에서는 새로운 이미지를 LaunchScreen.storyboard의 뷰에 적용합니다. 기존에 추가된 이미지 뷰가 있으면 제거하고, 새로운 이미지 뷰를 추가합니다.

3. 앱 런치 이미지 설정

위의 작업을 완료한 후, AppDelegate 클래스의 didFinishLaunchingWithOptions 메소드에서 런치 이미지를 표시하는 코드를 추가해야 합니다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 동적 런치 이미지를 사용하는 코드 삽입
    showDynamicLaunchImage()

    return true
}

func showDynamicLaunchImage() {
    guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first,
          let launchImagePath = documentsDirectory.appendingPathComponent("launch_image.png").path else {
        return
    }

    if FileManager.default.fileExists(atPath: launchImagePath) {
        let launchImage = UIImage(contentsOfFile: launchImagePath)
        let launchScreenView = UIImageView(image: launchImage)
        launchScreenView.frame = UIScreen.main.bounds
        launchScreenView.contentMode = .scaleAspectFill
        launchScreenView.alpha = 1.0

        guard let window = UIApplication.shared.windows.first else {
            return
        }
        
        window.addSubview(launchScreenView)
        window.bringSubviewToFront(launchScreenView)

        // 원하는 시간으로 애니메이션 효과 추가
        UIView.animate(withDuration: 0.5, delay: 1.0, options: .curveEaseOut, animations: {
            launchScreenView.alpha = 0.0
        }) { (_) in
            launchScreenView.removeFromSuperview()
        }
    }
}

위의 코드에서 showDynamicLaunchImage() 메소드는 Document 디렉토리에 저장된 이미지를 가져와서 앱 실행 시에 런치 이미지로 표시합니다. 표시된 이미지는 애니메이션 효과가 적용되어 앱이 시작될 때 서서히 사라지게 됩니다.

정리

이처럼 Swift 앱에서 동적 런치 이미지를 사용하는 방법을 알아보았습니다. 서버 또는 인터넷에서 이미지를 다운로드하여 앱의 런치 이미지로 사용하고, 로컬에 저장하여 애니메이션 효과와 함께 표시하는 방법을 살펴보았습니다. 동적 런치 이미지를 사용하면 앱을 보다 유연하고 동적으로 제작할 수 있으며, 사용자에게 더 나은 경험을 제공할 수 있습니다.

참고 자료