[英]How to get an authorized PHAsset from UIImagePickerController?
[英]get PHAsset From UIImagePickerController
我想從 UIImagePickerController 獲取 PHAsset 並使用以下代碼:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
PHAsset *phAsset = [info valueForKey:UIImagePickerControllerPHAsset];
if (phAsset) {
[assetsArr addObject:phAsset];
[galleryArr addObject:[info valueForKey:UIImagePickerControllerOriginalImage]];
}
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.galleryCollectionView reloadData];
[picker dismissViewControllerAnimated:YES completion:nil];
});
});
}
如果源類型是UIImagePickerControllerSourceTypePhotoLibrary
那么我可以通過上面的代碼獲得 PHAsset。 但是如果源類型是UIImagePickerControllerSourceTypeCamera
則 PHAsset 為零。
在這種情況下我如何獲得 PHAsset?
如果UIImagePickerControllerReferenceURL具有某些值,則可以使用以下代碼獲取資產:
PHFetchResult<PHAsset *> *result = [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:imageURL] options:nil];
根據您的要求,它可能有多個資產可供選擇。
如果您通過拍照獲得圖像,則可以通過信息詞典獲得原始圖像
然后將圖像保存在相冊中
並獲取 PHAsset 對象。
代碼如下所示:
/// Save image to album.
static func saveImageToAlbum(image: UIImage, completion: ( (Bool, PHAsset?) -> Void )? ) {
let status = PHPhotoLibrary.authorizationStatus()
if status == .denied || status == .restricted {
completion?(false, nil)
return
}
var placeholderAsset: PHObjectPlaceholder? = nil
PHPhotoLibrary.shared().performChanges({
let newAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
placeholderAsset = newAssetRequest.placeholderForCreatedAsset
}) { (suc, error) in
DispatchQueue.main.async {
if suc {
let asset = self.getAsset(from: placeholderAsset?.localIdentifier)
completion?(suc, asset)
} else {
completion?(false, nil)
}
}
}
}
private static func getAsset(from localIdentifier: String?) -> PHAsset? {
guard let id = localIdentifier else {
return nil
}
let result = PHAsset.fetchAssets(withLocalIdentifiers: [id], options: nil)
if result.count > 0{
return result[0]
}
return nil
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.