ios 使用animatedImageWithImages创建的UIImage是否存在错误?

olhwl3o2  于 2023-01-03  发布在  iOS
关注(0)|答案(3)|浏览(151)

最近我发现有时我的gif图像没有显示出来。所以我写了一个测试代码:

import UIKit
import ImageIO

extension UIImage {
    static func gifImageArray(data: NSData) -> [UIImage] {
        let source = CGImageSourceCreateWithData(data, nil)!
        let count = CGImageSourceGetCount(source)
        if count <= 1 {
            return [UIImage(data: data)!]
        } else {
            var images = [UIImage]();   images.reserveCapacity(count)
            for i in 0..<count {
                let image = CGImageSourceCreateImageAtIndex(source, i, nil)!
                images.append( UIImage(CGImage: image) )
            }
            return images;
        }
    }

    static func gifImage(data: NSData) -> UIImage? {
        let gif = gifImageArray(data)
        if gif.count <= 1 {
            return gif[0]
        } else {
            return UIImage.animatedImageWithImages(gif, duration: NSTimeInterval(gif.count) * 0.1)
        }
    }
}

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    let _gifData : NSData = NSData(contentsOfURL: NSURL(string: "https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif")!)!
    lazy var _gifImageArray : [UIImage] = UIImage.gifImageArray(self._gifData)
    lazy var _gifImage : UIImage = UIImage.gifImage(self._gifData)!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let table = UITableView(frame: self.view.bounds, style: .Plain)
        table.dataSource = self
        table.delegate = self
        self.view.addSubview(table)
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1000;
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let identifier = "cell"
        var cell : UITableViewCell! = tableView.dequeueReusableCellWithIdentifier(identifier);
        if cell == nil {
            cell = UITableViewCell(style: .Default, reuseIdentifier: identifier)
        }

        if let imageView = cell.imageView {
            /** 1. use the same UIImage object created by animatedImageWithImages
                the image disappear when reuse, and when touching cell, it reappear. */
            imageView.image = self._gifImage

            /** 2. create different UIImage by using same image array. this still not work */
//            imageView.image = UIImage.animatedImageWithImages(self._gifImageArray, duration: NSTimeInterval(self._gifImageArray.count) * 0.1)

            /** 3. create different UIImage from data, this seems work
                but use a lot of memories. and seems it has performance issue. */
//            imageView.image = UIImage.gifImage(self._gifData)

            /** 4. use same image array as imageView's animationImages.
                this kind works, but have different api than just set image.
                and when click on cell, the animation stops.    */
//            imageView.image = self._gifImageArray[0]
//            imageView.animationImages = self._gifImageArray
//            imageView.startAnimating()
        }

        return cell
    }
}

注意在cellForRowAtIndexPath:方法中,我尝试了不同的方法来设置imageView。
当我在lldb中po对象时,我注意到动画imageView有一个CAKeyframeAnimation。这是一个提示吗?
我怎样才能使gif完美的显示出来呢?任何建议都是有帮助的。
下面是一个预览:滚动后,gif消失,触摸时重新出现

e3bfsja2

e3bfsja21#

在我尝试了很多次之后,我终于想出了我需要改变:

imageView.image = self._gifImage

致:

imageView.image = nil // this is the magical!
imageView.image = self._gifImage

在设置新图像之前,只需要将图像设置为nil,动画就可以工作了!!就像一个魔术!
这绝对是苹果的缺陷。

gg0vcinb

gg0vcinb2#

尝试替换imageViewmyImageview或其他名称,因为单元格有默认的imageView属性,所以当你调用cell.imageView然后它返回单元格的默认imageview我认为.所以改变你的单元格的imageview的变量名.希望这将有所帮助:)

lstz6jyr

lstz6jyr3#

图像类可能需要SDAnimatedImage而不是UIImage

相关问题