如何显示刚刚选中的照片库中的图像?
How to display images that in photo gallery that were just selected?
目标: 用户从她的照片库中选择照片 > 点击 "Done" > 照片显示。
问题:照片在"Done"后没有立即显示。如果我再次打开选择器并点击 "Cancel."
,它们就会出现
当我使用 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)
在我的测试场景中,我使用了一个名为 photosAsset
的 PHFetchResult
作为 UICollectionView
的主要来源(我假设您有类似的设置)。
您必须更新此 PHFetchResult
以反映最近的更改,在我的例子中,我使用了以下行:
self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
2)
您必须使用 collectionView.reloadData()
重新加载视图是正确的,但是 completionHandler
中的代码不是主 thread/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)
}
目标: 用户从她的照片库中选择照片 > 点击 "Done" > 照片显示。
问题:照片在"Done"后没有立即显示。如果我再次打开选择器并点击 "Cancel."
,它们就会出现当我使用 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)
在我的测试场景中,我使用了一个名为 photosAsset
的 PHFetchResult
作为 UICollectionView
的主要来源(我假设您有类似的设置)。
您必须更新此 PHFetchResult
以反映最近的更改,在我的例子中,我使用了以下行:
self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
2)
您必须使用 collectionView.reloadData()
重新加载视图是正确的,但是 completionHandler
中的代码不是主 thread/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)
}