2015-01-13 16 views
18

Ich habe eine Zeichenfolge mit einer URL von GIF-Banner, die ich in App einfügen muss.Wie lade ich ein GIF-Bild in Swift?

Mein Code:

func showAdd(){ 
    Request.get("http://www.kyst.no/api/?apiMode=advertisement&lang=no", { (error: NSError?, data: NSData, text: NSString?) ->() in 
     let jsonResult: Dictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as Dictionary<String, AnyObject> 
     var banner : NSString = jsonResult["advertisement"]!["banner"] as NSString 
     self.addViewImage.image = UIImage.animatedImageNamed(banner, duration: 1) 
    }) 
} 

Aber nichts passiert. Bitte helfen Sie.

+0

Was –

+0

'animatedImageNamed()' nicht tun, was Sie denken, es tut Ihr Bild-URL ist. Diese Methode ist eine Abkürzung für das Laden einer Reihe statischer Bilder, die wie folgt benannt sind: image0', 'image1',' image2' usw. und legt sie als 'animationImages'-Array fest. Es lädt kein animiertes Bild wie ein GIF. Diese Frage wurde schon einmal gestellt und hat ein paar Antworten: http://stackoverflow.com/questions/9744682/display-animated-gif-in-ios - vorausgesetzt, es ist nicht Swift, aber es sollte nicht schwierig sein, die anzuwenden Antworten auf Swift. – Jasarien

+0

Wenn Sie den Open-Source-ObjC-Code in der oben verlinkten Antwort nicht verwenden möchten, müssen Sie die gif-Datei entschlüsseln, um die einzelnen Bilder zu extrahieren, und dann diese Bilder an die Bildansicht übergeben animationImages' Eigenschaft. – Jasarien

Antwort

37

laden GIF-Bild Swift:

SWIFT 3 : Download iOSDevCenters+GIF.swift file

# 1: Bild laden GIF Verwenden der Namens

let jeremyGif = UIImage.gifImageWithName("funny") 
    let imageView = UIImageView(image: jeremyGif) 
    imageView.frame = CGRect(x: 20.0, y: 50.0, width: self.view.frame.size.width - 40, height: 150.0) 
    view.addSubview(imageView) 

# 2: Legen Sie GIF-Bild mithilfe von Daten

let imageData = try? Data(contentsOf: Bundle.main.url(forResource: "play", withExtension: "gif")!) 
    let advTimeGif = UIImage.gifImageWithData(imageData!) 
    let imageView2 = UIImageView(image: advTimeGif) 
    imageView2.frame = CGRect(x: 20.0, y: 220.0, width: 
    self.view.frame.size.width - 40, height: 150.0) 
    view.addSubview(imageView2) 

# 3: Legen Sie GIF-Bild mit URL

let gifURL : String = "http://www.gifbin.com/bin/4802swswsw04.gif" 
    let imageURL = UIImage.gifImageWithURL(gifURL) 
    let imageView3 = UIImageView(image: imageURL) 
    imageView3.frame = CGRect(x: 20.0, y: 390.0, width: self.view.frame.size.width - 40, height: 150.0) 
    view.addSubview(imageView3) 

Download Demo Code

OUTPUT:

iPhone 8/iOS 11/xCode 9

enter image description here

+0

Bitte aktualisiere den Code für swift 3.0 –

+0

wie spiele ich das gif nur einmal mit jeremy gif? ?? \ – Mohanraj

+0

Hallo, wie setze ich das gif für das nächste Mal um von Anfang an zu starten. Jetzt scheint es immer in Schleife zu sein und animiert nach dem Zufallsprinzip. –

3
// 
// iOSDevCenters+GIF.swift 
// GIF-Swift 
// 
// Created by iOSDevCenters on 11/12/15. 
// Copyright © 2016 iOSDevCenters. All rights reserved. 
// 
import UIKit 
import ImageIO 


extension UIImage { 

public class func gifImageWithData(data: NSData) -> UIImage? { 
    guard let source = CGImageSourceCreateWithData(data, nil) else { 
     print("image doesn't exist") 
     return nil 
    } 

    return UIImage.animatedImageWithSource(source: source) 
} 

public class func gifImageWithURL(gifUrl:String) -> UIImage? { 
    guard let bundleURL = NSURL(string: gifUrl) 
     else { 
      print("image named \"\(gifUrl)\" doesn't exist") 
      return nil 
    } 
    guard let imageData = NSData(contentsOf: bundleURL as URL) else { 
     print("image named \"\(gifUrl)\" into NSData") 
     return nil 
    } 

    return gifImageWithData(data: imageData) 
} 

public class func gifImageWithName(name: String) -> UIImage? { 
    guard let bundleURL = Bundle.main 
     .url(forResource: name, withExtension: "gif") else { 
      print("SwiftGif: This image named \"\(name)\" does not exist") 
      return nil 
    } 

    guard let imageData = NSData(contentsOf: bundleURL) else { 
     print("SwiftGif: Cannot turn image named \"\(name)\" into NSData") 
     return nil 
    } 

    return gifImageWithData(data: imageData) 
} 

class func delayForImageAtIndex(index: Int, source: CGImageSource!) -> Double { 
    var delay = 0.1 

    let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil) 
    let gifProperties: CFDictionary = unsafeBitCast(CFDictionaryGetValue(cfProperties, Unmanaged.passUnretained(kCGImagePropertyGIFDictionary).toOpaque()), to: CFDictionary.self) 

    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 

    if delay < 0.1 { 
     delay = 0.1 
    } 

    return delay 
} 

class func gcdForPair(a: Int?, _ b: Int?) -> Int { 
    var a = a 
    var b = b 
    if b == nil || a == nil { 
     if b != nil { 
      return b! 
     } else if a != nil { 
      return a! 
     } else { 
      return 0 
     } 
    } 

    if a! < b! { 
     let c = a! 
     a = b! 
     b = c 
    } 

    var rest: Int 
    while true { 
     rest = a! % b! 

     if rest == 0 { 
      return b! 
     } else { 
      a = b! 
      b = rest 
     } 
    } 
} 

class func gcdForArray(array: Array<Int>) -> Int { 
    if array.isEmpty { 
     return 1 
    } 

    var gcd = array[0] 

    for val in array { 
     gcd = UIImage.gcdForPair(a: val, gcd) 
    } 

    return gcd 
} 

class func animatedImageWithSource(source: CGImageSource) -> UIImage? { 
    let count = CGImageSourceGetCount(source) 
    var images = [CGImage]() 
    var delays = [Int]() 

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

     let delaySeconds = UIImage.delayForImageAtIndex(index: Int(i), source: source) 
     delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms 
    } 

    let duration: Int = { 
     var sum = 0 

     for val: Int in delays { 
      sum += val 
     } 

     return sum 
    }() 

    let gcd = gcdForArray(array: delays) 
    var frames = [UIImage]() 

    var frame: UIImage 
    var frameCount: Int 
    for i in 0..<count { 
     frame = UIImage(cgImage: images[Int(i)]) 
     frameCount = Int(delays[Int(i)]/gcd) 

     for _ in 0..<frameCount { 
      frames.append(frame) 
     } 
    } 

    let animation = UIImage.animatedImage(with: frames, duration: Double(duration)/1000.0) 

    return animation 
} 
} 

Hier ist die Datei für Swift aktualisiert 3

Verwandte Themen