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 ả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?
Câu trả lời:
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
Đ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.
Đâ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"];
Kiểm tra liên kết này
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
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.
Đ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.
Đâ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
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
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 UIImageView
như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 UIWebView
và 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 để UIView
thêm chế độ UIWebView
xem 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 UIViewController
tô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 UIImage
phương thức tĩnh được gọi UIImage.animatedImageNamed
như 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.animatedImageWithImages
phươ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ệ.
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];
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
}
Với Swift và KingFisher
lazy var animatedPart: AnimatedImageView = {
let img = AnimatedImageView()
if let src = Bundle.main.url(forResource: "xx", withExtension: "gif"){
img.kf.setImage(with: src)
}
return img
}()