사이드 프로젝트를 진행하면서 화면을 캡처한 후에 공유하는 기능이 필요해서 본격적인 개발 전에 기능 구현 정도는 해봐야겠어서 미리 겪어본 것들을 적는다.

확실히 몇년 사이에 구글링만해도 없는 정보가 없는 것 같다. 하지만 SwiftUI로 적용되는 예제나 문서, 글은 확실히 적다...

나 스스로도 나중에 필요할 때, 검색하다 내 블로그를 들어올 수 있도록 작성하는 것이 목표이다.

어쩃든 시작

 

 

우선 Swift로 Screen Capture 하는 법을 찾아보면 UIView를 확장하여 적용된 코드들이 많이 나온다.

하지만 SwiftUI에서는 UIKit을 사용하지 않으려고 하기 때문에, 굳이 굳이 SwiftUI로의 전환을 하는 데에 생각보다 많은 시간을 쏟았다.

 

func takeCapture() -> UIImage {
        var image: UIImage?
        guard let currentLayer = UIApplication.shared.windows.first { $0.isKeyWindow }?.layer else { return UIImage() }

        let currentScale = UIScreen.main.scale

        UIGraphicsBeginImageContextWithOptions(currentLayer.frame.size, false, currentScale)

        guard let currentContext = UIGraphicsGetCurrentContext() else { return UIImage() }

        currentLayer.render(in: currentContext)

        image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        return image ?? UIImage()
    }

우선 화면을 Capture하여 UIImage로 뽑아주는 함수이다.

 

currentLayer 에 UIApplication.shared.keyWindow.layer 로 적용되어 있는 코드들이 많은데 keyWIndow가 deprecate되면서 다른 방법을 찾아보았다.

프로젝트에 중요한 기능이기에 일단 구현하여 실행을 해본 후에 공부하려고 맘 먹었다.(원래 이러면 안되는데... 시간이 부족해서 ㅜㅜ)

 

func saveInPhoto(img: UIImage) {
        UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil)
    }

    func sharePicture(img: UIImage) {
        let av = UIActivityViewController(activityItems: [img], applicationActivities: nil)
        UIApplication.shared.windows.first?.rootViewController?.present(av, animated: true, completion: nil)
    }

이어서 사진을 사진 iOS App에 저장하는 함수와 UIActivityVC를 사용하여 Share하는 함수이다.

 

이 코드들을 적용해서 캡처된 사진을 보면 사진이 뿌옇게 나오는 현상이 있었다.

그래서 UIImage의 background나 opacity 같은 속성을 건드려야 하나? 라고 생각하고 있던 찰나

버튼을 누르는 순간 바로 캡처가 되는 것인가? 라고 생각되어서 버튼을 누르고 0.5초 뒤에 캡처되게 구현하였다.

 

당연히 DispatchQueue.main.asyncAfter 를 이용해서 딜레이를 주니 정상적으로 캡처가 되었다.

 

TODO: 이번주 내로 저 메소드들에 있는 한 라인/속성 들이 무엇을 의미하는 지 공부해서 수정할 것이다.

 

p.s : 이번달 내로 2020 회고도 작성해보고 싶다... 2020년이 제일 바쁜 해였어서?!

 

+ Recent posts