스위프트에서 GIF 이미지를 로드하는 방법은 무엇입니까?
앱에 넣어야 할 GIF 배너 URL이 있는 String이 있습니다.
내 코드:
func showAdd(){
Request.get("http://www.kyst.no/api/?apiMode=advertisement&lang=no", { (error: NSError?, data: NSData, text: NSString?) -> () in
let jsonResult: Dictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as Dictionary<String, AnyObject>
var banner : NSString = jsonResult["advertisement"]!["banner"] as NSString
self.addViewImage.image = UIImage.animatedImageNamed(banner, duration: 1)
})
}
하지만 아무 일도 일어나지 않습니다.제발 도와주세요.
GIF 이미지를 신속하게 로드합니다.
#1 : 이 링크에서 swift 파일 복사:
#2 : 이름을 사용하여 GIF 이미지 로드
let jeremyGif = UIImage.gifImageWithName("funny")
let imageView = UIImageView(image: jeremyGif)
imageView.frame = CGRect(x: 20.0, y: 50.0, width: self.view.frame.size.width - 40, height: 150.0)
view.addSubview(imageView)
#3 : 데이터를 이용한 GIF 이미지 로드
let imageData = try? Data(contentsOf: Bundle.main.url(forResource: "play", withExtension: "gif")!)
let advTimeGif = UIImage.gifImageWithData(imageData!)
let imageView2 = UIImageView(image: advTimeGif)
imageView2.frame = CGRect(x: 20.0, y: 220.0, width:
self.view.frame.size.width - 40, height: 150.0)
view.addSubview(imageView2)
#4 : URL을 이용한 GIF 이미지 로드
let gifURL : String = "http://www.gifbin.com/bin/4802swswsw04.gif"
let imageURL = UIImage.gifImageWithURL(gifURL)
let imageView3 = UIImageView(image: imageURL)
imageView3.frame = CGRect(x: 20.0, y: 390.0, width: self.view.frame.size.width - 40, height: 150.0)
view.addSubview(imageView3)
출력:
아이폰8 / iOS11 / xCode9
로컬 GIF에 대한 단순 확장입니다.gif에서 모든 이미지를 가져와 imageView 애니메이션 이미지에 추가합니다.
extension UIImageView {
static func fromGif(frame: CGRect, resourceName: String) -> UIImageView? {
guard let path = Bundle.main.path(forResource: resourceName, ofType: "gif") else {
print("Gif does not exist at that path")
return nil
}
let url = URL(fileURLWithPath: path)
guard let gifData = try? Data(contentsOf: url),
let source = CGImageSourceCreateWithData(gifData as CFData, nil) else { return nil }
var images = [UIImage]()
let imageCount = CGImageSourceGetCount(source)
for i in 0 ..< imageCount {
if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {
images.append(UIImage(cgImage: image))
}
}
let gifImageView = UIImageView(frame: frame)
gifImageView.animationImages = images
return gifImageView
}
}
사용 방법:
guard let confettiImageView = UIImageView.fromGif(frame: view.frame, resourceName: "confetti") else { return }
view.addSubview(confettiImageView)
confettiImageView.startAnimating()
UIImageView API를 사용하여 사용자 지정을 반복하고 기간을 지정합니다.
confettiImageView.animationDuration = 3
confettiImageView.animationRepeatCount = 1
GIF 애니메이션이 끝나면 메모리를 해제합니다.
confettiImageView.animationImages = nil
먼저 포드를 설치합니다.
pod 'SwiftGifOrigin'
클래스에서 가져오기
import SwiftGifOrigin
그런 다음 이 코드를 뷰에 씁니다. 디딜로드 방법.
yourImageView.image = UIImage.gif(name: "imageName")
참고:- gif 파일 이름에 파일 확장자를 포함하지 마십시오. Ex:-
//Don't Do this
yourImageView.image = UIImage.gif(name: "imageName.gif")
출처: https://github.com/swiftgif/SwiftGif 참조
당신은 이 새로운 도서관을 이용할 수 있습니다.JellyGif는 CPU 및 메모리 성능이 뛰어나면서 Gif 프레임 지속 시간을 존중합니다.UITableViewCell 및 UICollectionViewCell과도 잘 작동합니다.시작하려면 다음 작업만 수행하면 됩니다.
import JellyGif
let imageView = JellyGifImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
//Animates Gif from the main bundle
imageView.startGif(with: .name("Gif name"))
//Animates Gif with a local path
let url = URL(string: "Gif path")!
imageView.startGif(with: .localPath(url))
//Animates Gif with data
imageView.startGif(with: .data(Data))
자세한 내용은 README를 참조하십시오.
import UIKit
import ImageIO
extension UIImage {
public class func gifImageWithData(data: NSData) -> UIImage? {
guard let source = CGImageSourceCreateWithData(data, nil) else {
print("image doesn't exist")
return nil
}
return UIImage.animatedImageWithSource(source: source)
}
public class func gifImageWithURL(gifUrl:String) -> UIImage? {
guard let bundleURL = NSURL(string: gifUrl)
else {
print("image named \"\(gifUrl)\" doesn't exist")
return nil
}
guard let imageData = NSData(contentsOf: bundleURL as URL) else {
print("image named \"\(gifUrl)\" into NSData")
return nil
}
return gifImageWithData(data: imageData)
}
public class func gifImageWithName(name: String) -> UIImage? {
guard let bundleURL = Bundle.main
.url(forResource: name, withExtension: "gif") else {
print("SwiftGif: This image named \"\(name)\" does not exist")
return nil
}
guard let imageData = NSData(contentsOf: bundleURL) else {
print("SwiftGif: Cannot turn image named \"\(name)\" into NSData")
return nil
}
return gifImageWithData(data: imageData)
}
class func delayForImageAtIndex(index: Int, source: CGImageSource!) -> Double {
var delay = 0.1
let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil)
let gifProperties: CFDictionary = unsafeBitCast(CFDictionaryGetValue(cfProperties, Unmanaged.passUnretained(kCGImagePropertyGIFDictionary).toOpaque()), to: CFDictionary.self)
var delayObject: AnyObject = unsafeBitCast(CFDictionaryGetValue(gifProperties, Unmanaged.passUnretained(kCGImagePropertyGIFUnclampedDelayTime).toOpaque()), to: AnyObject.self)
if delayObject.doubleValue == 0 {
delayObject = unsafeBitCast(CFDictionaryGetValue(gifProperties, Unmanaged.passUnretained(kCGImagePropertyGIFDelayTime).toOpaque()), to: AnyObject.self)
}
delay = delayObject as! Double
if delay < 0.1 {
delay = 0.1
}
return delay
}
class func gcdForPair(a: Int?, _ b: Int?) -> Int {
var a = a
var b = b
if b == nil || a == nil {
if b != nil {
return b!
} else if a != nil {
return a!
} else {
return 0
}
}
if a! < b! {
let c = a!
a = b!
b = c
}
var rest: Int
while true {
rest = a! % b!
if rest == 0 {
return b!
} else {
a = b!
b = rest
}
}
}
class func gcdForArray(array: Array<Int>) -> Int {
if array.isEmpty {
return 1
}
var gcd = array[0]
for val in array {
gcd = UIImage.gcdForPair(a: val, gcd)
}
return gcd
}
class func animatedImageWithSource(source: CGImageSource) -> UIImage? {
let count = CGImageSourceGetCount(source)
var images = [CGImage]()
var delays = [Int]()
for i in 0..<count {
if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {
images.append(image)
}
let delaySeconds = UIImage.delayForImageAtIndex(index: Int(i), source: source)
delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms
}
let duration: Int = {
var sum = 0
for val: Int in delays {
sum += val
}
return sum
}()
let gcd = gcdForArray(array: delays)
var frames = [UIImage]()
var frame: UIImage
var frameCount: Int
for i in 0..<count {
frame = UIImage(cgImage: images[Int(i)])
frameCount = Int(delays[Int(i)] / gcd)
for _ in 0..<frameCount {
frames.append(frame)
}
}
let animation = UIImage.animatedImage(with: frames, duration: Double(duration) / 1000.0)
return animation
}
}
여기 스위프트 3용으로 업데이트된 파일입니다.
누군가가 자산 폴더 대신 아무 폴더에나 gif를 넣으라고 하면 좋을 것입니다.
SWIFT 5에서는 세 번째 쌍을 사용하지 않고 모든 .gif 영상을 로드할 수 있습니다.이 코드를 추가하면 됩니다.
extension UIImage {
class func gifImageWithData(_ data: Data) -> UIImage? {
guard let source = CGImageSourceCreateWithData(data as CFData, nil) else {
return nil
}
let frameCount = CGImageSourceGetCount(source)
var images: [UIImage] = []
for i in 0..<frameCount {
if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
let image = UIImage(cgImage: cgImage)
images.append(image)
}
}
return UIImage.animatedImage(with: images, duration: 0.0)
}
}
import UIKit
// Assuming you have a UIImageView outlet named `gifImageView` in your view controller
guard let gifPath = Bundle.main.path(forResource: "example", ofType: "gif") else {
print("Failed to find the GIF image.")
return
}
guard let gifData = try? Data(contentsOf: URL(fileURLWithPath: gifPath)) else {
print("Failed to load the GIF image data.")
return
}
guard let gifImage = UIImage.gifImageWithData(gifData) else {
print("Failed to create the GIF image.")
return
}
// Set the loaded GIF image to the UIImageView
gifImageView.image = gifImage
위의 예에서 "example"을 파일 확장명 없이 GIF 파일 이름으로 바꾸고 GIF 파일이 Xcode 프로젝트에 추가되어 대상에 포함되었는지 확인합니다.
코드는 도우미 메서드 gifImage에 의존합니다.데이터(_:)를 사용하여 GIF 데이터에서 UI 이미지를 만듭니다.이 방법을 제공하는 확장 기능은 다음과 같습니다.
이게 저한테 효과가 있어요.
포드 파일:
platform :ios, '9.0'
use_frameworks!
target '<Your Target Name>' do
pod 'SwiftGifOrigin', '~> 1.7.0'
end
용도:
// An animated UIImage
let jeremyGif = UIImage.gif(name: "jeremy")
// A UIImageView with async loading
let imageView = UIImageView()
imageView.loadGif(name: "jeremy")
// A UIImageView with async loading from asset catalog(from iOS9)
let imageView = UIImageView()
imageView.loadGif(asset: "jeremy")
자세한 내용은 다음 링크를 참조하십시오. https://github.com/swiftgif/SwiftGif
만약 당신이 킹피셔를 사용한다면 당신은 사용할 수 있습니다.AnimatedImageView
.
따라서 의 .xib에서Identity Inspector
기존 이미지의 (오른쪽 사이드 메뉴)보기, 클래스 변경AnimatedImageView
.Module
자동으로 전환됩니다.Kingfisher
의 클래스 변경IBOutlet
보기 클래스의 경우에도 다음 작업을 참조하십시오.AnimatedImageView
.
사용하다CGAnimateImageDataWithBlock
또는CGAnimateImageAtURLWithBlock
iOS 13 이후.
extension UIImageView: SupportProduct {
public func load(name: String, in bundle: Bundle = .main) {
if let data = NSDataAsset(name: name, bundle: bundle)?.data {
CGAnimateImageDataWithBlock(data as CFData, nil) { (_, cgImage, _) in
self.image = UIImage(cgImage: cgImage)
}
}
}
}
언급URL : https://stackoverflow.com/questions/27919620/how-to-load-gif-image-in-swift
'programing' 카테고리의 다른 글
SQL 프로시저에서 테이블을 반환할 수 있습니까? (0) | 2023.08.08 |
---|---|
그리스몽키에서 jQuery를 사용하려면 어떻게 해야 합니까? (0) | 2023.08.08 |
둘 이상의 iPhone 응용 프로그램 간에 데이터 공유 (0) | 2023.08.08 |
UISegmentedControl에서 문자열 값 가져오기 (0) | 2023.08.08 |
iOS에서 numpad 키보드에 '완료' 버튼을 추가하는 방법 (0) | 2023.08.08 |