我有问题。由于单元格中图像的大小,我的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
答案 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
作为加载图像,名称方法缓存图像