2014-12-02 5 views
1

Я работаю над приложением с разделом фотографии и представлением коллекции. Изображения в ячейках размыты. Они резкие, если смотреть в полноэкранном режиме и на другом экране в виде миниатюр в виде таблицы. У меня есть подкласс NSManagedObject, который называется Photo, который импортирует фотографии, ссылается на PHAssets и содержит методы, называемые getAsset() и getImage (size).Размытые изображения в UICollectionViewCell с использованием Photo Kit и Swift

Вот код для моего 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 
} 

От cellForItemAtIndex в моем UICollectionView подкласса:

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. 
     } 
    } 

2 Методы из Фото NSManagedObject подклассу находя фотографию на основе даты его создания:

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 
} 

Инструкция println() в getI Маг показал мне, что это получается каждый образ дважды в разных размерах, ни один из которых не является указанным размером. Сначала выбирается меньший размер для каждой ячейки, за которым следует больший размер для каждой ячейки. Я подозреваю, что меньшее изображение взорвано, чтобы заполнить мою ячейку (которая, я думаю, сделает ее размытой), и она не загружается в большем размере (что, я думаю, будет ясным). Журнал регистрации:

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 и клетки устанавливаются на 250 х 175. Мой ImageView установлен в Aspect Fit в инспекторе.

ответ

1

Фрейм фотографий сначала выбирает размер меньшего размера для скорости, а затем выбирает больший размер изображения.
Вы можете сказать ему, чтобы принести только большего размера, установив параметры запроса:

let requestOptions = PHImageRequestOptions() 
requestOptions.deliveryMode = .HighQualityFormat 
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFit , options: requestOptions) { (result, info) in 
    // ... 
} 

см PHImageRequestOptionsDeliveryMode больше вариантов.