Iphone UIImageView में एनिमेटेड Gif छवि जोड़ें


80

मुझे UIImageview में एक URL से एक एनिमेटेड Gif छवि लोड करने की आवश्यकता है।

जब मैंने सामान्य कोड का उपयोग किया, तो छवि लोड नहीं हुई।

क्या एनिमेटेड Gif छवियों को लोड करने का कोई अन्य तरीका है?


मुझे UIImageview में निम्न URL से छवि लोड करने की आवश्यकता है .... feedads.g.doubleclick.net/~at/K_fHnmr7a7T0pru2TjQC29TsPYY1/1/ddi
वेलमुरुगन

स्विफ्ट के लिए इस लिंक पर जाएं: stackoverflow.com/questions/27919620/…
Mr.Javed Multani

जवाबों:


138
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

1
मुझे UIImageview में निम्न URL से छवि लोड करने की आवश्यकता है .... feedads.g.doubleclick.net/~at/K_fHnmr7a7T0pru2TjQC29TsPYY1/1/ddi
वेलमुरुगन

NSData * mydata = [[NSData आवंटित] initWithContentsOfURL: [NSURL URLWithString: myurl]]; UIImage * myimage = [[UIImage आवंटन] initWithData: imageData]; url से पढ़ने के लिए इसका उपयोग करें फिर इस ऑब्जेक्ट को सरणी में जोड़ें
Ishu

8
IPhone OS ठीक से एनिमेटेड GIF छवियों को प्रदर्शित नहीं करेगा और नहीं करेगा। इसके लिए UIImage ऑब्जेक्ट का उपयोग नहीं किया जा सकता है। भले ही यह GIF छवियों का समर्थन करता है, किसी भी एनीमेशन को छोड़ दिया जाएगा और केवल पहला फ्रेम दिखाया जाएगा। इसलिए, यदि आपको एक iPhone ऐप के अंदर एक एनिमेटेड GIF प्रदर्शित करने की आवश्यकता है, तो आप खराब हो गए हैं। : कोड लिखे जाने की जरूरत है ... एक नज़र यहाँ ले लो pliep.nl/blog/2009/04/...
fyasar

10
आपको बस छवि दृश्य के बजाय वेब दृश्य का उपयोग करने की आवश्यकता है
श्रेयश गर्ग

2
github.com/mayoff/uiimage-from-animated-gif बस इस श्रेणी का उपयोग करें क्योंकि यह सब कुछ स्वचालित रूप से उत्तर में वर्णित किया गया है
माइकल

53

यह एक स्वीकृत उत्तर मिला है, लेकिन मैं हाल ही में 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"]];

जादू की तरह काम करता है।


1
क्या URL से gif लोड करने के बजाय प्रोजेक्ट में सीधे फ़ाइल का उपयोग करने का कोई तरीका होगा?
जुलायन्साद

2
UIImage + animatedGIF ... सबसे अच्छी श्रेणियों में से एक जो मैंने कभी देखी है ... धन्यवाद @robmayoff
Whyoz

22

यहाँ Gif Image का उपयोग करने का सबसे अच्छा समाधान है। अपने प्रोजेक्ट में Github से SDWebImage जोड़ें।

#import "UIImage+GIF.h"

_imageViewAnimatedGif.image= [UIImage sd_animatedGIFNamed:@"thumbnail"];

यही वह है जिसकी तलाश में मैं हूं। आपको धन्यवाद! अगर मैं एक चीज़ जोड़ सकता हूं: UIImageView को सिंथेसाइज़ नहीं किया गया है, लेकिन स्टोरीबोर्ड में बनाया जाना चाहिए और इसके IBOutlet से जुड़ा होना चाहिए :)
लूसिया बेलार्डिनेली

12

इस लिंक को देखें

https://github.com/mayoff/uiimage-from-animated-gif/blob/master/uiimage-from-animated-gif/UIImage%2BanimatedGIF.h

और इन मामलों का आयात करें 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];

आशा है कि यह उपयोगी है


8

यदि आप तृतीय पक्ष पुस्तकालय का उपयोग नहीं करना चाहते हैं,

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 फ़ाइल जोड़ते हैं।


आपका कोड कोड: थ्रेड 1: EXC_BAD_INSTRUCTION (कोड = EXC_I386_INVOP, सबकोड = 0x0) त्रुटि!
कोडर ACJHP

5

यह UIImageView का उपयोग करने की आवश्यकता को पूरा नहीं करता है, लेकिन शायद यह आपके लिए चीजों को सरल करेगा। क्या आपने UIWebView का उपयोग करने पर विचार किया है?

NSString *gifUrl = @"http://gifs.com";
NSURL *url = [NSURL URLWithString: gifUrl];
[webView loadRequest: [NSURLRequest requestWithURL:url]

यदि आप चाहें, तो इंटरनेट की आवश्यकता वाले URL से लिंक करने के बजाय, आप अपने Xcode प्रोजेक्ट में HTML फ़ाइल आयात कर सकते हैं और रूट को स्ट्रिंग में सेट कर सकते हैं।


3

यहाँ एक दिलचस्प पुस्तकालय है: https://github.com/Flipboard/FLAnimatedImage

मैंने डेमो उदाहरण का परीक्षण किया और यह बहुत अच्छा काम कर रहा है। यह UIImageView का बच्चा है। तो मुझे लगता है कि आप इसे सीधे अपने स्टोरीबोर्ड में भी उपयोग कर सकते हैं।

चियर्स


3

मुझे पता है कि एक उत्तर पहले ही स्वीकृत हो चुका है, लेकिन यह साझा करने की कोशिश नहीं करना मुश्किल है कि मैंने एक एम्बेडेड फ्रेमवर्क बनाया है जो आईओएस में जीआईएफ सपोर्ट जोड़ता है, ऐसा लगता है जैसे आप किसी अन्य यूआईकिट फ्रेमवर्क वर्ग का उपयोग कर रहे थे।

यहाँ एक उदाहरण है:

UIGifImage *gif = [[UIGifImage alloc] initWithData:imageData];
anUiImageView.image = gif;

Https://github.com/ObjSal/UIGifImage/releases से नवीनतम रिलीज़ डाउनलोड करें

- सैल


1

यदि आपको URL से gif छवि लोड करनी है, तो आप हमेशा gif को छवि टैग में एम्बेड कर सकते हैं UIWebView


1

स्विफ्ट 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)

डॉक्स से:

बनाता है और छवियों के एक मौजूदा सेट से एक एनिमेटेड छवि देता है। एनिमेटेड छवि में शामिल सभी छवियों को समान आकार और पैमाने साझा करना चाहिए।



0

स्विफ्ट 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
  }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.