Swift:UICollectionView图像加载

时间:2015-08-17 19:40:02

标签: ios swift uicollectionview

我有问题。由于单元格中图像的大小,我的UICollectionView的滚动太迟了。图像的调整大小功能几乎没有变化。由于图像的数量,我无法制作图像的小副本。 那么,如果我需要像在原生相册应用中一样快速加载图片,我该怎么办?我听说过“延迟加载”,但我在Swift中找不到任何关于它的教程。

这是我的cellForItemAtIndexPath:

        let cell : MyCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCollectionViewCell

        let painting = objs[indexPath.row]
        let name = (painting.valueForKey("imageName") as? String)!
        let path = NSBundle.mainBundle().bundlePath.stringByAppendingString("/\(name)") as NSString

        cell.imageView.image = UIImage(contentsOfFile: path as String)

        cell.layer.shouldRasterize = true
        cell.layer.rasterizationScale = UIScreen.mainScreen().scale

        return cell

如果你能帮助我解决这个问题,我会很高兴的! PS该应用程序不会从WEB加载它。所有图像都在设备上的应用程序中。

更新

最后,我实现了SDWebImage。这是我发现的最佳解决方案。 这是我的cellForRowAtIndexPath:

let cell : MyCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCollectionViewCell
        let block: SDWebImageCompletionBlock! = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType, imageURL: NSURL!) -> Void in
            //          println(self)
        }
        let path = NSBundle.mainBundle().bundlePath.stringByAppendingString("/\(images[indexPath.row])") as NSString
        let url = NSURL.fileURLWithPath(path as String)
        println(url)

        cell.imageView.sd_setImageWithURL(url, placeholderImage: UIImage(named: "placeholder"), completed: block)

        cell.layer.shouldRasterize = true
        cell.layer.rasterizationScale = UIScreen.mainScreen().scale

        return cell

2 个答案:

答案 0 :(得分:4)

这是因为你在主线程中加载图像,最好在后台线程上加载图像,使其更加流畅,更好地解码后台线​​程上的图像。它会直接设置图像,当你将图像设置为imageView时它会解码,所以最好首先对其进行解码,然后将其设置为imageView.image

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in
                var image = UIImage(contentsOfFile: path as String)
UIGraphicsBeginImageContextWithOptions(image!.size, true, 0);
        image?.drawAtPoint(CGPointZero)
        image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    cell.imageView.image = image
                })

答案 1 :(得分:0)

你为什么不用:

let name = (painting.valueForKey("imageName") as? String)!
cell.imageView.image = UIImage(named: name)

而不是使用NSBundle作为加载图像,名称方法缓存图像