Ios 使用Photo Kit和Swift在UICollectionViewCell中显示模糊图像

Ios 使用Photo Kit和Swift在UICollectionViewCell中显示模糊图像,ios,swift,uicollectionview,xcode6.1,photokit,Ios,Swift,Uicollectionview,Xcode6.1,Photokit,我正在开发一个带有照片区和收藏视图的应用程序。单元格中的图像模糊。它们在全屏和不同屏幕上显示时都很清晰,就像表格视图中的缩略图一样。我有一个名为Photo的NSManagedObject子类,它导入照片,引用相集,并包含名为getAsset()和getImage(size)的方法 以下是我的UICollectionViewCell子类的代码: class PhotoCollectionViewCell: UICollectionViewCell { @IBOutlet weak var ima

我正在开发一个带有照片区和收藏视图的应用程序。单元格中的图像模糊。它们在全屏和不同屏幕上显示时都很清晰,就像表格视图中的缩略图一样。我有一个名为Photo的NSManagedObject子类,它导入照片,引用相集,并包含名为getAsset()和getImage(size)的方法

以下是我的UICollectionViewCell子类的代码:

class PhotoCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imageForCell: UIImageView!
@IBOutlet weak var labelForCell: UILabel!

func setImage (photo: Photo?, size: CGSize) -> Bool {

    if photo != nil {
        if let image = photo?.getImage(size) {
            var label = photo?.getLabel()

            imageForCell.contentMode = UIViewContentMode.ScaleAspectFit
            imageForCell.image = image
            labelForCell.text = label
            return true
        } 
    }
    return false  
} 
    if let photo: Photo = listOfPhotos[indexPath.item] as? Photo { 

        var size: CGSize = CGSizeMake(500, 350)

        if !cell.setImage(photo, size: size) {
            // Handles a missing photo.
        }
    }
从my UICollectionView子类中的cellForItemAtIndex:

class PhotoCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var imageForCell: UIImageView!
@IBOutlet weak var labelForCell: UILabel!

func setImage (photo: Photo?, size: CGSize) -> Bool {

    if photo != nil {
        if let image = photo?.getImage(size) {
            var label = photo?.getLabel()

            imageForCell.contentMode = UIViewContentMode.ScaleAspectFit
            imageForCell.image = image
            labelForCell.text = label
            return true
        } 
    }
    return false  
} 
    if let photo: Photo = listOfPhotos[indexPath.item] as? Photo { 

        var size: CGSize = CGSizeMake(500, 350)

        if !cell.setImage(photo, size: size) {
            // Handles a missing photo.
        }
    }
Photo NSManagedObject子类中的2种方法根据照片的创建日期查找照片:

func getAsset() -> PHAsset? {

    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "creationDate = %@", photoDate)
    let assets = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: fetchOptions)
    var asset: PHAsset?
    if assets.count == 1 {
        asset = assets.lastObject as? PHAsset
    } 
    else {
        // Handles invalid result
    } 
    return asset
} 

func getImage(size: CGSize) -> UIImage? {

    var image: UIImage?

    if let asset = getAsset() {
        PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFit , options: nil) { (result, info) -> Void in 

            image = result
            println("P gI: Image gotten. Image Size: \(image?.size), Size: \(size), Date: \(asset.creationDate)") 
        } 
    } 
    else {
    } 
    return image
} 
getImage中的println()语句告诉我,这将以不同的大小获取每个图像两次,但两次都不是指定的大小。首先获取每个单元格的较小尺寸,然后获取每个单元格的较大尺寸。我怀疑较小的图像被放大以填满我的手机(我认为这会使手机变得模糊),而没有加载较大的图像(我认为这会很清晰)。记录输出:

P gI: Image gotten. Image Size: Optional((64.0,48.0)), Size: (500.0,350.0), Date: 2014-12-04 18:56:20 +0000
P gI: Image gotten. Image Size: Optional((64.0,48.0)), Size: (500.0,350.0), Date: 2014-12-04 18:56:36 +0000
P gI: Image gotten. Image Size: Optional((2048.0,1530.0)), Size: (500.0,350.0), Date: 2014-12-04 18:56:20 +0000
P gI: Image gotten. Image Size: Optional((2048.0,1530.0)), Size: (500.0,350.0), Date: 2014-12-04 18:56:36 +0000

在我的故事板中,imageView和cell都设置为250 x 175。我的imageView在inspector中设置为Aspect Fit。

照片框架首先获取较小的图像大小以提高速度,然后获取较大的图像大小。
通过设置请求选项,您可以告诉它仅获取较大的图像:

let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .HighQualityFormat
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFit , options: requestOptions) { (result, info) in
    // ...
}
有关更多选项,请参见PHIMAGERequestOptions交付模式