Thêm ảnh Gif động trong Iphone UIImageView


80

Tôi cần tải ảnh Gif động từ URL trong UIImageview.

Khi tôi sử dụng mã bình thường, hình ảnh không tải.

Có cách nào khác để tải ảnh Gif động không?


tôi cần tải hình ảnh từ URL sau trong UIImageview .... feedads.g.doubleclick.net/~at/K_fHnmr7a7T0pru2TjQC29TsPYY/1/di
Velmurugan

Đi qua liên kết này cho nhanh: stackoverflow.com/questions/27919620/...
Mr.Javed Multani

Câu trả lời:


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

Bạn có thể tải nhiều hơn một ảnh gif.

Bạn có thể chia gif của mình bằng lệnh ImageMagick sau :

convert +adjoin loading.gif out%d.gif

1
tôi cần tải hình ảnh từ URL sau trong UIImageview .... feedads.g.doubleclick.net/~at/K_fHnmr7a7T0pru2TjQC29TsPYY/1/di
Velmurugan

NSData * mydata = [[NSDataosystem] initWithContentsOfURL: [NSURL URLWithString: myurl]]; UIImage * myimage = [[UIImageosystem] initWithData: imageData]; sử dụng này để đọc từ url sau đó thêm đối tượng này để mảng
Ishu

8
Hệ điều hành iPhone không thể và sẽ không hiển thị ảnh GIF động đúng cách. Đối tượng UIImage không thể được sử dụng cho việc này. Mặc dù nó hỗ trợ ảnh GIF nhưng mọi hoạt ảnh sẽ bị loại bỏ và chỉ khung hình đầu tiên được hiển thị. Vì vậy, nếu bạn cần hiển thị một ảnh GIF động bên trong ứng dụng iPhone, bạn đã gặp khó khăn. Mã cần được viết ... Hãy xem ở đây: pliep.nl/blog/2009/04/…
fyasar

10
Bạn chỉ cần sử dụng xem web thay vì xem hình ảnh
Shreesh Garg

2
github.com/mayoff/uiimage-from-animated-gif chỉ cần sử dụng loại này vì nó làm cho tất cả mọi thứ được mô tả trong các câu trả lời tự động
Michael

53

Điều này đã tìm thấy một câu trả lời được chấp nhận, nhưng gần đây tôi đã xem qua phần mở rộng UIImage + animationGIF UIImage. Nó cung cấp danh mục sau:

+[UIImage animatedImageWithAnimatedGIFURL:(NSURL *)url]

cho phép bạn chỉ cần:

#import "UIImage+animatedGIF.h"
UIImage* mygif = [UIImage animatedImageWithAnimatedGIFURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/File:Rotating_earth_(large).gif"]];

Hoạt động như ma thuật.


1
Có cách nào để sử dụng một tệp trực tiếp trong dự án thay vì tải gif từ một URL không?
juliensaad

2
UIImage + animatedGIF ... một trong những loại tốt nhất mà tôi từng thấy ... nhờ @robmayoff
whyoz

22

Đây là giải pháp tốt nhất để sử dụng Gif Image. Thêm SDWebImage từ Github trong dự án của bạn.

#import "UIImage+GIF.h"

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

Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn bạn! Nếu tôi có thể thêm một điều: UIImageView không được tổng hợp nhưng nên được tạo trong bảng phân cảnh và được liên kết với IBOutlet của nó :)
Lucia Belardinelli

12

Kiểm tra liên kết này

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

và nhập các clases này UIImage + animationGIF.h, UIImage + animationGIF.m

Sử dụng mã này

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

Hy vọng điều này là hữu ích


8

Nếu bạn không muốn sử dụng thư viện của bên thứ 3,

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
    }
}

Để sử dụng,

override func viewDidLoad() {
    super.viewDidLoad()
    imageView.setGIFImage(name: "gif_file_name")
}

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

Đảm bảo rằng bạn thêm tệp gif trong dự án, không phải trong thư mục .xcassets.


Mã của bạn kết hợp: Chuỗi 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0) error!
Coder ACJHP

5

Điều này không đáp ứng yêu cầu sử dụng UIImageView, nhưng có thể điều này sẽ đơn giản hóa mọi thứ cho bạn. Bạn đã cân nhắc sử dụng UIWebView chưa?

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

Nếu bạn muốn, thay vì liên kết với một URL yêu cầu Internet, bạn có thể nhập tệp HTML vào dự án Xcode của mình và đặt gốc trong chuỗi.


3

Đây là một thư viện thú vị: https://github.com/Flipboard/FLAnimatedImage

Tôi đã thử nghiệm ví dụ demo và nó hoạt động rất tốt. Nó là một đứa con của UIImageView. Vì vậy, tôi nghĩ bạn cũng có thể sử dụng nó trong Bảng phân cảnh của mình trực tiếp.

Chúc mừng


3

Tôi biết rằng một câu trả lời đã được chấp thuận, nhưng thật khó để không cố gắng chia sẻ rằng tôi đã tạo một khung nhúng bổ sung hỗ trợ Gif cho iOS giống như thể bạn đang sử dụng bất kỳ lớp UIKit Framework nào khác.

Đây là một ví dụ:

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

Tải xuống bản phát hành mới nhất từ https://github.com/ObjSal/UIGifImage/releases

- Sal


1

Nếu bạn phải tải ảnh gif từ URL, bạn luôn có thể nhúng ảnh gif vào thẻ hình ảnh trong a UIWebView.


1

SWIFT 3

Đây là bản cập nhật cho những người cần phiên bản Swift !.

Một vài ngày trước, tôi cần phải làm một cái gì đó như thế này. Tôi tải một số dữ liệu từ một máy chủ theo các thông số cụ thể và trong khi đó tôi muốn hiển thị một hình ảnh gif khác "đang tải". Tôi đang tìm kiếm một tùy chọn để làm điều đó với một UIImageViewnhưng tiếc là tôi không tìm thấy thứ gì đó để làm điều đó mà không cần tách các hình ảnh .gif. Vì vậy, tôi quyết định triển khai một giải pháp bằng cách sử dụng a UIWebViewvà tôi muốn chia sẻ nó:

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)
    }
} 

Tôi đã tạo một tiện ích mở rộng để UIViewthêm chế độ UIWebViewxem phụ dưới dạng và hiển thị các hình ảnh .gif chỉ cần chuyển tên của nó.

Bây giờ trong UIViewControllertôi có một UIView'loadingView' có tên là chỉ báo 'đang tải' của tôi và bất cứ khi nào tôi muốn hiển thị hình ảnh .gif, tôi đã làm như sau:

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
    }
}

khi tôi muốn thay đổi hình ảnh gif, chỉ cần gọi hàm configureLoadingView()với tên của hình ảnh .gif mới của tôi và gọi showLoadingView(), hideLoadingView()mọi thứ đều hoạt động tốt !.

NHƯNG...

... nếu bạn đã tách hình ảnh thì bạn có thể tạo hình ảnh động nó trong một dòng duy nhất bằng một UIImagephương thức tĩnh được gọi UIImage.animatedImageNamednhư thế này:

imageView.image = UIImage.animatedImageNamed("imageName", duration: 1.0)

Từ các tài liệu:

Phương thức này tải một loạt tệp bằng cách thêm một loạt số vào tên tệp cơ sở được cung cấp trong tham số tên. Tất cả các hình ảnh có trong ảnh động phải có cùng kích thước và tỷ lệ.

Hoặc bạn có thể tạo nó bằng UIImage.animatedImageWithImagesphương pháp như sau:

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

Từ các tài liệu:

Tạo và trả về một hình ảnh động từ một nhóm hình ảnh hiện có. Tất cả các hình ảnh có trong ảnh động phải có cùng kích thước và tỷ lệ.


0

Bạn có thể sử dụng 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];

0

Swift 3:

Như đã đề xuất ở trên, tôi đang sử dụng FLAnimatedImage với FLAnimatedImageView. Và tôi đang tải gif dưới dạng tập dữ liệu từ xcassets. Điều này cho phép tôi cung cấp các ảnh gif khác nhau cho iphone và ipad cho các mục đích hiển thị và cắt ứng dụng. Điều này hiệu quả hơn nhiều so với bất kỳ thứ gì khác mà tôi đã thử. Cũng dễ dàng tạm dừng sử dụng .stopAnimating ().

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

0

Với SwiftKingFisher

   lazy var animatedPart: AnimatedImageView = {
        let img = AnimatedImageView()
        if let src = Bundle.main.url(forResource: "xx", withExtension: "gif"){
            img.kf.setImage(with: src)
        }
        return img
   }()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.