मुझे UIImageview में एक URL से एक एनिमेटेड Gif छवि लोड करने की आवश्यकता है।
जब मैंने सामान्य कोड का उपयोग किया, तो छवि लोड नहीं हुई।
क्या एनिमेटेड Gif छवियों को लोड करने का कोई अन्य तरीका है?
मुझे UIImageview में एक URL से एक एनिमेटेड Gif छवि लोड करने की आवश्यकता है।
जब मैंने सामान्य कोड का उपयोग किया, तो छवि लोड नहीं हुई।
क्या एनिमेटेड Gif छवियों को लोड करने का कोई अन्य तरीका है?
जवाबों:
UIImageView* animatedImageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
animatedImageView.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"image1.gif"],
[UIImage imageNamed:@"image2.gif"],
[UIImage imageNamed:@"image3.gif"],
[UIImage imageNamed:@"image4.gif"], nil];
animatedImageView.animationDuration = 1.0f;
animatedImageView.animationRepeatCount = 0;
[animatedImageView startAnimating];
[self.view addSubview: animatedImageView];
आप एक से अधिक gif चित्र लोड कर सकते हैं।
आप निम्न ImageMagick कमांड का उपयोग करके अपने GIF को विभाजित कर सकते हैं :
convert +adjoin loading.gif out%d.gif
यह एक स्वीकृत उत्तर मिला है, लेकिन मैं हाल ही में UIImage + animatedGIF UIImage एक्सटेंशन पर आया हूं । यह निम्नलिखित श्रेणी प्रदान करता है:
+[UIImage animatedImageWithAnimatedGIFURL:(NSURL *)url]
आपको बस अनुमति देने के लिए:
#import "UIImage+animatedGIF.h"
UIImage* mygif = [UIImage animatedImageWithAnimatedGIFURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/File:Rotating_earth_(large).gif"]];
जादू की तरह काम करता है।
यहाँ Gif Image का उपयोग करने का सबसे अच्छा समाधान है। अपने प्रोजेक्ट में Github से SDWebImage जोड़ें।
#import "UIImage+GIF.h"
_imageViewAnimatedGif.image= [UIImage sd_animatedGIFNamed:@"thumbnail"];
इस लिंक को देखें
और इन मामलों का आयात करें UIImage + animatedGIF.h, UIImage + animatedGIF.m
इस कोड का उपयोग करें
NSURL *urlZif = [[NSBundle mainBundle] URLForResource:@"dots64" withExtension:@"gif"];
NSString *path=[[NSBundle mainBundle]pathForResource:@"bar180" ofType:@"gif"];
NSURL *url=[[NSURL alloc] initFileURLWithPath:path];
imageVw.image= [UIImage animatedImageWithAnimatedGIFURL:url];
आशा है कि यह उपयोगी है
यदि आप तृतीय पक्ष पुस्तकालय का उपयोग नहीं करना चाहते हैं,
extension UIImageView {
func setGIFImage(name: String, repeatCount: Int = 0 ) {
DispatchQueue.global().async {
if let gif = UIImage.makeGIFFromCollection(name: name, repeatCount: repeatCount) {
DispatchQueue.main.async {
self.setImage(withGIF: gif)
self.startAnimating()
}
}
}
}
private func setImage(withGIF gif: GIF) {
animationImages = gif.images
animationDuration = gif.durationInSec
animationRepeatCount = gif.repeatCount
}
}
extension UIImage {
class func makeGIFFromCollection(name: String, repeatCount: Int = 0) -> GIF? {
guard let path = Bundle.main.path(forResource: name, ofType: "gif") else {
print("Cannot find a path from the file \"\(name)\"")
return nil
}
let url = URL(fileURLWithPath: path)
let data = try? Data(contentsOf: url)
guard let d = data else {
print("Cannot turn image named \"\(name)\" into data")
return nil
}
return makeGIFFromData(data: d, repeatCount: repeatCount)
}
class func makeGIFFromData(data: Data, repeatCount: Int = 0) -> GIF? {
guard let source = CGImageSourceCreateWithData(data as CFData, nil) else {
print("Source for the image does not exist")
return nil
}
let count = CGImageSourceGetCount(source)
var images = [UIImage]()
var duration = 0.0
for i in 0..<count {
if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
let image = UIImage(cgImage: cgImage)
images.append(image)
let delaySeconds = UIImage.delayForImageAtIndex(Int(i),
source: source)
duration += delaySeconds
}
}
return GIF(images: images, durationInSec: duration, repeatCount: repeatCount)
}
class func delayForImageAtIndex(_ index: Int, source: CGImageSource!) -> Double {
var delay = 0.0
// Get dictionaries
let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil)
let gifPropertiesPointer = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 0)
if CFDictionaryGetValueIfPresent(cfProperties, Unmanaged.passUnretained(kCGImagePropertyGIFDictionary).toOpaque(), gifPropertiesPointer) == false {
return delay
}
let gifProperties:CFDictionary = unsafeBitCast(gifPropertiesPointer.pointee, to: CFDictionary.self)
// Get delay time
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 ?? 0
return delay
}
}
class GIF: NSObject {
let images: [UIImage]
let durationInSec: TimeInterval
let repeatCount: Int
init(images: [UIImage], durationInSec: TimeInterval, repeatCount: Int = 0) {
self.images = images
self.durationInSec = durationInSec
self.repeatCount = repeatCount
}
}
काम में लाना,
override func viewDidLoad() {
super.viewDidLoad()
imageView.setGIFImage(name: "gif_file_name")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
imageView.stopAnimating()
}
सुनिश्चित करें कि आप .ifassets फ़ोल्डर में नहीं, प्रोजेक्ट में gif फ़ाइल जोड़ते हैं।
यह UIImageView का उपयोग करने की आवश्यकता को पूरा नहीं करता है, लेकिन शायद यह आपके लिए चीजों को सरल करेगा। क्या आपने UIWebView का उपयोग करने पर विचार किया है?
NSString *gifUrl = @"http://gifs.com";
NSURL *url = [NSURL URLWithString: gifUrl];
[webView loadRequest: [NSURLRequest requestWithURL:url]
यदि आप चाहें, तो इंटरनेट की आवश्यकता वाले URL से लिंक करने के बजाय, आप अपने Xcode प्रोजेक्ट में HTML फ़ाइल आयात कर सकते हैं और रूट को स्ट्रिंग में सेट कर सकते हैं।
यहाँ एक दिलचस्प पुस्तकालय है: https://github.com/Flipboard/FLAnimatedImage
मैंने डेमो उदाहरण का परीक्षण किया और यह बहुत अच्छा काम कर रहा है। यह UIImageView का बच्चा है। तो मुझे लगता है कि आप इसे सीधे अपने स्टोरीबोर्ड में भी उपयोग कर सकते हैं।
चियर्स
मुझे पता है कि एक उत्तर पहले ही स्वीकृत हो चुका है, लेकिन यह साझा करने की कोशिश नहीं करना मुश्किल है कि मैंने एक एम्बेडेड फ्रेमवर्क बनाया है जो आईओएस में जीआईएफ सपोर्ट जोड़ता है, ऐसा लगता है जैसे आप किसी अन्य यूआईकिट फ्रेमवर्क वर्ग का उपयोग कर रहे थे।
यहाँ एक उदाहरण है:
UIGifImage *gif = [[UIGifImage alloc] initWithData:imageData];
anUiImageView.image = gif;
Https://github.com/ObjSal/UIGifImage/releases से नवीनतम रिलीज़ डाउनलोड करें
- सैल
स्विफ्ट 3
यहाँ उन लोगों के लिए अद्यतन है जिन्हें स्विफ्ट संस्करण की आवश्यकता है!
कुछ दिनों पहले मुझे ऐसा कुछ करने की जरूरत थी। मैं विशिष्ट मापदंडों के अनुसार एक सर्वर से कुछ डेटा लोड करता हूं और इस बीच मैं "लोडिंग" की एक अलग जीआईएफ छवि दिखाना चाहता था। मैं यह करने के लिए एक विकल्प की तलाश में था, UIImageView
लेकिन दुर्भाग्य से मुझे .gif छवियों को विभाजित किए बिना इसे करने के लिए कुछ नहीं मिला। इसलिए मैंने एक समाधान का उपयोग करने का फैसला किया UIWebView
और मैं इसे साझा करना चाहता हूं:
extension UIView{
func animateWithGIF(name: String){
let htmlString: String = "<!DOCTYPE html><html><head><title></title></head>" +
"<body style=\"background-color: transparent;\">" +
"<img src=\""+name+"\" align=\"middle\" style=\"width:100%;height:100%;\">" +
"</body>" +
"</html>"
let path: NSString = Bundle.main.bundlePath as NSString
let baseURL: URL = URL(fileURLWithPath: path as String) // to load images just specifying its name without full path
let frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
let gifView = UIWebView(frame: frame)
gifView.isOpaque = false // The drawing system composites the view normally with other content.
gifView.backgroundColor = UIColor.clear
gifView.loadHTMLString(htmlString, baseURL: baseURL)
var s: [UIView] = self.subviews
for i in 0 ..< s.count {
if s[i].isKind(of: UIWebView.self) { s[i].removeFromSuperview() }
}
self.addSubview(gifView)
}
func animateWithGIF(url: String){
self.animateWithGIF(name: url)
}
}
मैंने एक एक्सटेंशन बनाया UIView
जिसके लिए एक UIWebView
सबव्यू के रूप में जोड़ा गया है और .gif छवियों को केवल उसके नाम से गुजरता है।
अब मेरे UIViewController
पास एक UIView
'लोडिंग व्यू' नाम है जो मेरा 'लोडिंग' संकेतक है और जब भी मैं .gif छवि दिखाना चाहता था, मैंने कुछ इस तरह किया:
class ViewController: UIViewController {
@IBOutlet var loadingView: UIView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
configureLoadingView(name: "loading.gif")
}
override func viewDidLoad() {
super.viewDidLoad()
// .... some code
// show "loading" image
showLoadingView()
}
func showLoadingView(){
loadingView.isHidden = false
}
func hideLoadingView(){
loadingView.isHidden = true
}
func configureLoadingView(name: String){
loadingView.animateWithGIF(name: "name")// change the image
}
}
जब मैं gif छवि को बदलना चाहते हैं, बस समारोह बुलाया configureLoadingView()
मेरी नई .gif छवि और फोन करने के नाम के साथ showLoadingView()
,hideLoadingView()
ठीक से सब कुछ काम करता है!।
परंतु...
... यदि आपके पास छवि छितरी हुई है, तो आप इसे एक UIImage
स्थिर विधि के साथ एक पंक्ति में चेतन कर सकते हैं, जिसे UIImage.animatedImageNamed
इस प्रकार कहा जाता है:
imageView.image = UIImage.animatedImageNamed("imageName", duration: 1.0)
डॉक्स से:
यह विधि नाम पैरामीटर में प्रदान की गई आधार फ़ाइल नाम के लिए संख्याओं की एक श्रृंखला को जोड़कर फाइलों की एक श्रृंखला को लोड करती है। एनिमेटेड छवि में शामिल सभी छवियों को समान आकार और पैमाने साझा करना चाहिए।
या आप इसे UIImage.animatedImageWithImages
इस तरह से बना सकते हैं :
let images: [UIImage] = [UIImage(named: "imageName1")!,
UIImage(named: "imageName2")!,
...,
UIImage(named: "imageNameN")!]
imageView.image = UIImage.animatedImage(with: images, duration: 1.0)
डॉक्स से:
बनाता है और छवियों के एक मौजूदा सेट से एक एनिमेटेड छवि देता है। एनिमेटेड छवि में शामिल सभी छवियों को समान आकार और पैमाने साझा करना चाहिए।
आप https://github.com/Flipboard/FLAnimatedImage का उपयोग कर सकते हैं
#import "FLAnimatedImage.h"
NSData *dt=[NSData dataWithContentsOfFile:path];
imageView1 = [[FLAnimatedImageView alloc] init];
FLAnimatedImage *image1 = [FLAnimatedImage animatedImageWithGIFData:dt];
imageView1.animatedImage = image1;
imageView1.frame = CGRectMake(0, 5, 168, 80);
[self.view addSubview:imageView1];
स्विफ्ट 3:
जैसा कि ऊपर बताया गया है कि मैं FLAnimatedImage एक FLAnimatedImageView के साथ उपयोग कर रहा हूं। और मैं xcassets से डेटा सेट के रूप में gif लोड कर रहा हूं। यह मुझे iPhone और iPad के लिए अलग gifs प्रदान करने की अनुमति देता है उपस्थिति और अनुप्रयोग टुकड़ा करने की क्रिया प्रयोजनों के लिए। मैंने जितनी भी कोशिश की है, यह उससे कहीं ज्यादा परफॉर्मेंट है। .StopAnimating () का उपयोग करके विराम देना भी आसान है।
if let asset = NSDataAsset(name: "animation") {
let gifData = asset.data
let gif = FLAnimatedImage(animatedGIFData: gifData)
imageView.animatedImage = gif
}