ios - 如何显示刚刚选中的照片库中的图像?

标签 ios swift uicollectionview uiimagepickercontroller elcimagepickercontroller

目标:用户从她的照片库中选择照片 > 点击“完成”> 照片显示。

问题:“完成”后照片不会立即显示。如果我再次打开选择器并点击“取消”,它们就会出现。

当我使用 UIImagePickerController 时,这工作正常(照片立即显示),但后来我切换到 ELCImagePickerController 进行多选,它不再工作。

预感

  • 显示所有图像的 CollectionView 没有被重新加载?但我尝试在选择图像后调用 collectionView.reloadData()(在 completionHandler 上)。这没有用。

如果有帮助,这是我的 ViewController.swift 中的 elcImagePickerController 函数

func elcImagePickerController(picker: ELCImagePickerController!, didFinishPickingMediaWithInfo info: [AnyObject]!) {

    println("inside elcImagePickerController")

    self.dismissViewControllerAnimated(true, completion: nil)

    if (info.count == 0) {
        return
    }

    var pickedImages = NSMutableArray()
    for any in info {
        let dict = any as! NSMutableDictionary
        let image = dict.objectForKey(UIImagePickerControllerOriginalImage) as! UIImage
        pickedImages.addObject(image)
    }

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT

    dispatch_async(dispatch_get_global_queue(priority, 0), {


        PHPhotoLibrary.sharedPhotoLibrary().performChanges(
            {

                for img in pickedImages{

                    // Request creating an asset from the image
                    // create multiple creationRequestForAssetFromImage

                    let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(img as! UIImage) // add to main gallery

                    // / Request editing the album
                    let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection, assets: self.photosAsset)

                    // Get a placeholder for the new asset and add it to the album editing request
                    let assetPlaceholder = createAssetRequest.placeholderForCreatedAsset

                    albumChangeRequest.addAssets([assetPlaceholder])

                }


            }, completionHandler: {(success, error) in
                NSLog("Adding Image to Library -> %@", (success ? "Success" : "Error"))
                picker.dismissViewControllerAnimated(true, completion: nil)
            }
        )
    })

最佳答案

我花了一段时间来复制您的场景和错误,但我设法并找到了解决方案!

completionHandler 中调用 collectionView.reloadData() 的做法是正确的,但还需要做一些工作。


1)

在我的测试场景中,我使用了名为 photosAssetPHFetchResult 作为 UICollectionView 的主要来源(我假设您有类似的设置)。

您必须更新此 PHFetchResult 以反射(reflect)最近的更改,在我的例子中,我使用了以下行:

self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)

2)

您必须使用collectionView.reloadData()重新加载 View 是正确的,但是completionHandler内部的代码不在主线程/UI线程上运行。所以你必须像下面这样调用它:

dispatch_async(dispatch_get_main_queue(), {self.collectionView?.reloadData()})

总结:

最后,您的 completionHandler 应该类似于以下内容:

completionHandler: {(success, error) in
    NSLog("Adding Image to Library -> %@", (success ? "Success" : "Error"))
    self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
    dispatch_async(dispatch_get_main_queue(), {self.collectionView?.reloadData()})
    picker.dismissViewControllerAnimated(true, completion: nil)
}

关于ios - 如何显示刚刚选中的照片库中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30686496/

相关文章:

ios - iOS 方向问题

ios - NSAttributedString 中的一个单词有两种不同的颜色

ios - 根据所选的 UITableViewCell 行执行 segue

ios - 在 swift 4 中取消选择 Collectionview 中的复选标记

ios - 异步绘图和触摸

用于 ScrollView 和粘性页脚的 iOS Autolayout

swift - 为什么选择器不快速调用

ios - 动态计算 collectionView 单元格高度

ios - 来自 UICollectionViewCell 中的 Class 对象的 UITableView 数据源

iphone - 使用 "User Defined Runtime Attributes"在 Storyboard中本地化 View