使用Xcode和UICollectionView中的资产目录管理800个图像

时间:2014-11-29 10:19:28

标签: ios xcode swift uiimage uicollectionview

我正在创建一个带有自定义图像的表情符号键盘,它有845个不同的图像(如果你包括@ 1x,@ 2x和@ 3x则为2535)。将它们作为资产导入Xcode后,编译程序的速度非常慢,在iOS模拟器中显示键盘需要3秒钟。

我也有使用UICollectionView来显示表情符号的问题:当我滚动它时会崩溃。我试图将我的UICollectionViewCell约束为UIView,其背景是表情符号,这样我就不会创建UIImageView但性能仍然很差。

这是我的cellForItemAtIndexPath()函数:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell
    let emoji = UIImage(named: emojiCollections[collectionUsed][positionInCollection]) // Creating the UIImage with the asset
    let emojiBackgroundColor = UIColor(patternImage: emoji!) // Set the background of the cell.
    positionInCollection++
    return cell
}

有了这些问题,我想知道管理这些数量的图像的最佳方法是什么,以及如何在UICollectionView中正确显示它们(即具有良好的滚动性能)。

谢谢!

1 个答案:

答案 0 :(得分:1)

我假设您正在加载所有图像并将其存储在内存中,这是您问题的根源。您应该只在需要时动态加载表情符号图像。当您使用UIImage(named:...)方法加载图像时,UIKit会为您进行缓存。

对于UICollectionView,使用backgroundColor属性设置图像并不是一种好习惯。使用UICollectionViewCell方法创建setBackgroundImage(image: UIImage)子类,该方法将图像设置为UIImageView。在子类中,您还可以执行以下操作以确保在重用单元格之前卸载旧图像。

override func prepareForReuse() {
    super.prepareForReuse()
    imageView.image = nil
}