Добавить анимированные GIF-изображения в iPhone с помощью UIImageView



Мне нужно загрузить анимированное изображение Gif из URL-адреса в UIImageview.



когда я использовал обычный код, изображение не загружалось.



есть ли другой способ загрузки анимированных GIF изображений?

512   12  

12 ответов:

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.

вы можете разделить свой gif, используя следующее ImageMagick:

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 изображения. Добавьте SDWebImage из Github в свой проект.

#import "UIImage+GIF.h"

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

регистрация по этой ссылке

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

и импортировать эти clases UIImage + animatedGIF.h, UIImage+animatedGIF.м

используйте этот код

 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];

надеюсь, что это полезно

Это не соответствует требованию использования UIImageView, но, возможно, это упростит вам задачу. Вы рассматривали возможность использования UIWebView?

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

Если вы хотите, вместо ссылки на URL-адрес, который требует интернета, вы можете импортировать HTML-файл в свой проект Xcode и установить корень в строке.

вот интересная библиотека:https://github.com/Flipboard/FLAnimatedImage

я протестировал демонстрационный пример, и он отлично работает. Это дитя UIImageView. Поэтому я думаю, что вы можете использовать его в своей раскадровке напрямую.

Ура

Я знаю, что ответ уже одобрен, но его трудно не пытаться поделиться тем, что я создал встроенную платформу, которая добавляет поддержку Gif в iOS, которая чувствует себя так же, как если бы вы использовали любой другой класс UIKit Framework.

вот пример:

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

загрузите последнюю версию с https://github.com/ObjSal/UIGifImage/releases

-- Sal

Если вы должны загрузить изображение gif из URL, вы всегда можете вставить gif в тег изображения в UIWebView.

вы можете использовать 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];

Swift 3:

как было предложено выше, я использую FLAnimatedImage с FLAnimatedImageView. И я загружаю gif как набор данных из xcassets. Это позволяет мне предоставлять различные gifs для iphone и ipad для внешнего вида и приложений нарезки целей. Это гораздо более эффективно, чем все остальное, что я пробовал. Это также легко приостановить использование .stopAnimating ().

if let asset = NSDataAsset(name: "animation") {
    let gifData = asset.data
    let gif = FLAnimatedImage(animatedGIFData: gifData)
    imageView.animatedImage = gif
  }

SWIFT 3

вот обновление для тех, кому нужна версия Swift!.

несколько дней назад мне нужно было сделать что-то подобное. Я загружаю некоторые данные с сервера в соответствии с определенными параметрами, и в то же время я хотел показать другое gif-изображение "загрузки". Я искал вариант, чтобы сделать это с 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 С именем "loadingView", который является моим индикатором "загрузки" и всякий раз, когда я хотел показать .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)

документы:

этот метод загружает ряд файлов путем добавления ряда чисел к имени базового файла, указанного в параметре name. Все изображения, включенные в анимированное изображение, должны иметь одинаковый размер и масштаб.

или вы можете сделать это с помощью тега UIImage.animatedImageWithImages способ такой:

let images: [UIImage] = [UIImage(named: "imageName1")!,
                                            UIImage(named: "imageName2")!,
                                            ...,
                                            UIImage(named: "imageNameN")!]
imageView.image = UIImage.animatedImage(with: images, duration: 1.0)

документы:

создает и возвращает анимированное изображение из существующего набора изображений. Все изображения, включенные в анимированное изображение, должны иметь одинаковый размер и масштаб.

Если вы знаете продолжительность gif-файла, вам не нужна сторонняя библиотека.

extension UIImage {
    class func getImagesFromGIF(asset: String) -> [UIImage]? {
        guard let dataAsset = NSDataAsset(name: asset) else {
            print("Cannot turn image named \"\(asset)\" into NSDataAsset")
            return nil
        }

        guard let source = CGImageSourceCreateWithData(dataAsset.data as CFData, nil) else {
            print("Source for the image does not exist")
            return nil
        }

        let count = CGImageSourceGetCount(source)
        var images = [UIImage]()

        for i in 0..<count {
            if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
                let image = UIImage(cgImage: cgImage)
                images.append(image)
            }
        }

        return images
    }
}

чтобы использовать это расширение,

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    DispatchQueue.global().async {
        if let images = UIImage.getImagesFromGIF(asset: "GIFFILENAME") {
            let gifDuration = 5.0 // need to change this
            DispatchQueue.main.async {
                self.imageView.animationImages = images
                self.imageView.animationDuration = gifDuration
                self.imageView.startAnimating()                    
            }
        }
    }        
}


override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    imageView.stopAnimating()
}

Comments

    Ничего не найдено.