쉽고 빠르게 Gif를 사용할 수 있습니다.
- UIImage와 UIImageView extension을 기반으로 구현했습니다.
- 원격 GIF를 불러올 수 있고, 로딩 바를 설정할 수 있습니다.
- 뛰어난 CPU/메모리 성능을 보입니다.
- 반복 재생 횟수를 조정할 수 있습니다.
- 'levelOfIntegrity' 파라미터를 통해 Integrity 레벨을 조절합니다.
- 'memoryLimit' 파라미터를 통해 CPU/메모리 사용량을 조절합니다. (CPU - 메모리는 tradeoff 관계)
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
pod 'SwiftyGif'
애플리케이션에 프레임워크 추가하기에 나온 일반적인 카르타고 사용법을 사용합니다.
Cartfile
에 나열된 프레임워크 중에서 SwityGif를 추가할 때, GitHub repositories에 구문을 적용합니다.:
github "kirualex/SwiftyGif"
https://github.com/kirualex/SwiftyGif.git
현재 Xcode xcassets
폴더는 .gif
파일을 이미지로 인식하지 못합니다. 즉 assets밖에 '.gif' 파일을 위치시켜야 합니다. gif
폴더를 만들어 그 안에서 관리하는 것을 추천합니다.
SwiftyGif는 UIImage
와 UIImageView
를 사용합니다.
import SwiftyGif
do {
let gif = try UIImage(gifName: "MyImage.gif")
let imageview = UIImageView(gifImage: gif, loopCount: 3) // 3번 반복
imageview.frame = view.bounds
view.addSubview(imageview)
} catch {
print(error)
}
@IBOutlet var myImageView : UIImageView!
...
let gif = try UIImage(gifName: "MyImage.gif")
self.myImageView.setGifImage(gif, loopCount: -1) // 무한 반복
// GIF를 나타내는 URL을 설정합니다
let url = URL(string: "...")
let loader = UIActivityIndicatorView(style: .white)
cell.gifImageView.setGifFromURL(url, customLoader: loader)
SwiftyGifManager
는 같은 메모리 풀은 사용해 하나 이상의 UIImageView를 관리합니다. 이를 사용해 쉽게 메모리 제한을 할 수 있습니다. 따로 매니저를 선언하지 않는다면 SwiftyGifManager.defaultManager
를 사용합니다.
Integrity 레벨을 낮게 설정하면 프레임을 건너뜁니다. CPU와 메모리 사용량도 낮춥니다. 많은 gif를 한 번에 미리보기 할 때 유용한 옵션입니다.
do {
let gif = try UIImage(gifName: "MyImage.gif", levelOfIntegrity:0.5)
} catch {
print(error)
}
SwiftyGif는 UIImageVIew
에 대해 다양한 제어 기능을 제공합니다.
self.myImageView.startAnimatingGif()
self.myImageView.stopAnimatingGif()
self.myImageView.showFrameAtIndexDelta(delta: Int)
self.myImageView.showFrameAtIndex(index: Int)
더 쉽게 사용하기 위한 메소드들이 제공됩니다. :
self.myImageView.isAnimatingGif() // 현재 gif가 재생중인지 아닌지
self.myImageView.gifImage!.framesCount() // 해당 gif 프레임 수 리턴
SwiftyGifDelegate를 선언해 gif 생명 주기(=Lifecycle)를 받습니다. 예를 들어 MyController
라는 ViewController를 delegate로 사용합니다.:
override func viewDidLoad() {
super.viewDidLoad()
self.imageView.delegate = self
}
extension에 채택해 쉽게 사용할 수 있습니다.:
extension MyController : SwiftyGifDelegate {
func gifURLDidFinish(sender: UIImageView) {
print("gifURLDidFinish")
}
func gifURLDidFail(sender: UIImageView) {
print("gifURLDidFail")
}
func gifDidStart(sender: UIImageView) {
print("gifDidStart")
}
func gifDidLoop(sender: UIImageView) {
print("gifDidLoop")
}
func gifDidStop(sender: UIImageView) {
print("gifDidStop")
}
}
CPU 사용량(평균) | 메모리 사용량(평균) | |
---|---|---|
FLAnimatedImage | 35% | 9,5Mb |
SwiftyGif | 2% | 18,4Mb |
SwiftyGif(memoryLimit:10) | 34% | 9,5Mb |
CPU 사용량(평균) | 메모리 사용량(평균) | |
---|---|---|
FLAnimatedImage | 65% | 25,1Mb |
SwiftyGif | 22% | 105Mb |
SwiftyGif(memoryLimit:20) | 45% | 26Mb |
테스트 환경 : iPhone 6S, iOS 9.3.1, Xcode 7.3.
메모리를 제한하면 CPU 사용량이 늘어나는 것을 확인할 수 있습니다. (trade-off)