Lottie Animation
- What is the Lottie Animation
- JSON 기반의 이미지 파일
- Lottie 라이브러리 설치
- pod init
- podfile에 추가 pod 'lottie-ios'
- pod install
- open ProjectName.xcworkspace
- Lottie 사용법
Animation 띄우기
- private var animationView: AnimationView? // 애니메이션뷰 변수 선언
- animationView = .init(name: "coffee") // 애니메이션 뷰에 다운받은 coffee.json(로티이미지) 설정
- animationView!.frame = view.bounds // 애니메이션뷰 프레임 설정
- animationView!.contentMode = .scaleAscpectFill // 비율 유지하면서 화면 가득 채우기 옵션
- animationView!.loopMode = .loop // 애니메이션 반복 설정
- animationView!.animationSpeed = 0.5 // 애니메이션 재생 속도
- view.addSubView(animationView!) // 베이스 뷰에 애니메이션 뷰 추가
- animationView!.play() // 애니메이션 재생
Progress Image
- private var progressView: AnimationView? // 변수 선언
- progressView = .init(name: "download") // download.json 설정
- progressView.frame = view.bounds
- progressView.contentMode = .scaleAspectFill
- view.addSubview(progressView!)
url 다운로드 세팅
- let url = URL(string: "https://archive.org/download/SampleVideo1280x7205mb/SampleVideo_1280x720_5mb.mp4")! // URL 설정
- let configuration = URLSessionConfiguration.default // url Configuration 설정
- let operationQueue = OperationQueue() // 비동기 처리를 위한 큐 설정
- let session = URLSession(configuration: configuration, delegate: self, delegateQueue: operationQueue) // URLSession 생성
- let downloadTask = session.downloadTask(with: url) // downloadTask 실행
- downloadTask.resume()
시작, 끝, 완료를 구분하기 위한 enum 설정
- enum ProgressKeyFrames: CGFloat { case start = 140 case end = 187 case complete = 240 }
ProgressView Play
- progressView?.play(fromFrame: 0, // set start frame
toFrame: ProgressKeyFrames.start.rawValue, // set end point
loopMode: .none, // 반복 설정
completion: { [self weak] (_) in
self?.startDownload() // 다운로드 함수 호출 } )
- progressView?.play(fromFrame: 0, // set start frame
toFrame: ProgressKeyFrames.start.rawValue, // set end point
loopMode: .none, // 반복 설정
completion: { [self weak] (_) in
startDownLoad()
- progressView?.play(fromFrame: ProgressKeyFrames.start.rawValue, // set start frame toFrame: ProgressKeyFrames.end.rawValue, // set end frame loopMode: .none, // 반복 설정 completion: { [weak self] (_) in self?.endDownload() // 다운로드 끝 함수 호출 } )
endDownload()
- progressView?.play(fromFrame: ProgressKeyFrames.end.rawValue, toFrame: ProgresssKeyFrames.complete.rawValue, loopMode: .none) )
URLSessionDownloadDelegate
private func progress(to progress: CGFloat) { let progressRange = ProgressKeyFrames.end.rawValue - ProgressKeyFrames.start.rawValue // set range let progressFrame = progressRange * progress // set frame with progress let currentFrame = progressFrame + ProgressKeyFrames.start.rawValue // set currentFrame
progressView?.currentFrame = currentFrame // updateFrame
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { let percentDownloaded:CGFloat = CGFloat(totalBytesWritten) / CGFloat(totalBytesExpectedToWrite) // 현재 다운로드 퍼센트 계산 DispatchQueue.main.async { self.progress(to: percentDownloaded) // 메인큐로 progress 함수로 넘겨줌 } }
func urlSession(_ session: URLSession, downloadTask: URLSessionDownLoadTask, didFinishDownloadingTo location: URL) { DispatchQueue.main.async { self.endDownload() // 다운로드 완료 } }