Swift-使用照片框架选择时保持照片质量

Swift-使用照片框架选择时保持照片质量,swift,uicollectionview,Swift,Uicollectionview,我已经创建了一个UICollectionview,在其中我使用照片框架显示相册中的所有照片。点击照片可创建具有放大版本的新视图 在我的collectionView中,我所有的照片看起来都很好,很清晰,但是当点击时,这张照片的分辨率会受到很大的影响。我希望我的代码以原始格式和质量打开图像,就像iOS相册一样 func getPhotosFromAlbum() { let imageManager = PHImageManager.default() let requestOpt

我已经创建了一个UICollectionview,在其中我使用照片框架显示相册中的所有照片。点击照片可创建具有放大版本的新视图

在我的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()
        })
    }
}

问题是因为您获取的图像大小为200x200:

imageManager.requestImagefor:fetchResult.objectat:i,targetSize:CGSizewidth:200,高度:200,内容模式:.aspectFill,选项:requestOptions,resultHandler:{image,中出现错误 self.imageArray.appendimage! }


您需要做的是,当用户点击缩略图或当新的视图控制器加载并以最大大小请求图像时,请求图像。

您说得对!我完全忘记了在取货时已经设置了尺寸。标记为答案。