2017-03-17 78 views
0

我創建了一個UICollectionview,其中使用Photos Framework顯示來自相冊的所有照片。點擊照片可創建放大版本的新視圖。Swift - 使用Photos Framework進行選擇時保持照片質量

我的所有照片在我的collectionView中看起來不錯而且清脆,但是當點擊時,該照片的分辨率會受到重大影響。我想讓我的代碼以原始格式和質量打開圖片,就像iOS相冊一樣。

func getPhotosFromAlbum() { 

    let imageManager = PHImageManager.default() 

    let requestOptions = PHImageRequestOptions() 
    requestOptions.isSynchronous = true 
    requestOptions.deliveryMode = .highQualityFormat 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 

    let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) 

     if fetchResult.count > 0 { 

      for i in 0..<fetchResult.count { 

       imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in 

        self.imageArray.append(image!) 
       }) 
      } 

     } else { 
      self.collectionView?.reloadData() 
     } 
} 

// MARK: UICollectionViewDataSource 
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return imageArray.count 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PhotosCollectionViewCell 

    cell.imageView.image = imageArray[indexPath.row] 
    cell.imageView.addGestureRecognizer(UIGestureRecognizer(target: self, action: #selector(tapGesture))) 

    return cell 
} 

var startingFrame: CGRect? 
var blackBackGroundView: UIView? 

func tapGesture(sender: UITapGestureRecognizer) { 
    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { 

     let imageView = self.collectionView?.cellForItem(at: indexPath) 

     startingFrame = imageView?.superview?.convert((imageView?.frame)!, to: nil) 

     let zoomingImageView = UIImageView(frame: startingFrame!) 
     zoomingImageView.image = imageArray[indexPath.row] 
     zoomingImageView.isUserInteractionEnabled = true 
     zoomingImageView.contentMode = .scaleAspectFill 
     zoomingImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleZoomOut))) 

     if let keyWindow = UIApplication.shared.keyWindow { 
      blackBackGroundView = UIView(frame: keyWindow.frame) 
      blackBackGroundView?.backgroundColor = UIColor.black 
      blackBackGroundView?.alpha = 0 

      keyWindow.addSubview(blackBackGroundView!) 
      keyWindow.addSubview(zoomingImageView) 

      UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 

       self.blackBackGroundView?.alpha = 1 

       let height = self.startingFrame!.height/self.startingFrame!.width * keyWindow.frame.width 

       zoomingImageView.frame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: height) 

       zoomingImageView.center = keyWindow.center 

       }, completion: {(completed) in 
        // Do nothing 
      }) 
     } 
    } 
} 

func handleZoomOut(tapGesture: UITapGestureRecognizer) { 
    if let zoomOutImageView = tapGesture.view { 

     UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 
      zoomOutImageView.frame = self.startingFrame! 
      self.blackBackGroundView?.alpha = 0 

      }, completion: {(completed: Bool) in 
       zoomOutImageView.removeFromSuperview() 
     }) 
    } 
} 

回答

1

的問題是,因爲你已經在這個尺寸(200×200)獲取的圖像:

imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in self.imageArray.append(image!) })

你需要做的是,當用戶點擊縮略圖請求圖像(或者當新的視圖控制器加載時)並以最大尺寸請求它。

+0

你是對的!完全放棄了我的想法,大小已經在取回期間設置。標記爲答案。 –