我更新了从ios7到ios8的应用程序,并努力让UIImagePicker工作从“我的照片流”类别的照片加载图片。 UIImagePicker实现是标准的,我用以下方法检索所选照片的URL:
NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];
然后我使用新的IOS8 API来加载这张照片:
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil];
这无效。 result.count为零,未找到任何图像。该URL的UUID与我从“Moments”或“Camera Roll”中选择照片时的UUID不同,但看起来很好。 (电话正在运行8.1):
url NSURL * @“assets-library://asset/asset.JPG?id = 4522DBD1-862C-42BE-AF7C-0D6C76CA7590& ext = JPG”
任何人都有一些代码来加载“我的照片流”中的照片或者为UIImagePicker显示器禁用它的方法吗?
使用较旧的ALAssetsLibrary assetForURL API也无法加载这些图像。
答案 0 :(得分:4)
我想你可以尝试这个来获得我的照片流"相册。
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumMyPhotoStream options:nil];
我的照片流专辑中的照片上传到iCloud,iCloud将有效管理它们,30天内拍摄的照片就在那里,我认为PHAsset或ALAssetLibrary处理本地存储的资产。这是我在设备上进行的测试,我使用了imagePicker从流专辑中获取了一个照片网址,这是
"assets-library://asset/asset.JPG?id=60AE4E50-B835-47EB-B896-5974C21F8C9B&ext=JPG";
在同一张照片上使用PHAsset,我得到了localIdentifier:
"60AE4E50-B835-47EB-B896-5974C21F8C9B/L0/001"
所以我认为你可以从url中删除id,并找出哪个资产的本地标识符包含它,然后你得到你想要的PHAsset。
答案 1 :(得分:1)
在任何地方都没有找到任何答案之后,我为PHAsset创建了以下扩展,这在iOS 8.2中很有用,尽管我认为它在理论上很慢。虽然之前的一条评论说这是在iOS8.2测试版上修复的,但是现在iOS 8.2发布后,这个bug仍然存在。
import Photos
import UIKit
extension PHAsset {
class func fetchAssetWithALAssetURL (alURL: NSURL) -> PHAsset? {
let phPhotoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
let assetManager = PHImageManager()
var phAsset : PHAsset?
let optionsForFetch = PHFetchOptions()
optionsForFetch.includeHiddenAssets = true
var fetchResult = PHAsset.fetchAssetsWithALAssetURLs([alURL], options: optionsForFetch)
if fetchResult?.count > 0 {
return fetchResult[0] as? PHAsset
} else {
var str = alURL.absoluteString!
let startOfString = advance(find(str, "=")!, 1)
let endOfString = advance(startOfString, 36)
let range = Range<String.Index>(start:startOfString, end:endOfString)
let localIDFragment = str.substringWithRange(range)
let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
if fetchResultForPhotostream?.count > 0 {
let photostream = fetchResultForPhotostream![0] as PHAssetCollection
let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
if fetchResultForPhotostreamAssets?.count >= 0 {
var stop : Bool = false
for var i = 0; i < fetchResultForPhotostreamAssets.count && !stop; i++ {
let phAssetBeingCompared = fetchResultForPhotostreamAssets[i] as PHAsset
if phAssetBeingCompared.localIdentifier.rangeOfString(localIDFragment, options: nil, range: nil, locale: nil) != nil {
phAsset = phAssetBeingCompared
stop = true
}
}
return phAsset
}
}
return nil
}
}
}
答案 2 :(得分:0)
此处讨论使用ALAssetsLibrary从My Photo Stream加载具有指定URL的图像:
ALAssetsLibrary assetForURL: always returning nil for photos in "My Photo Stream" in iOS 8.1
简而言之,您不必使用assetForURL来迭代Photo Stream中的所有项目,并将其URL与您的URL进行比较。上面的链接包含一个代码示例。
它看起来很尴尬,比assetForURL工作得慢,并且确定是否没有找到任何指定URL的文件并不容易,但我没有找到任何其他方法(迁移到Photos框架除外) 。
答案 3 :(得分:0)
对于PHAsset,我使用
[[PHImageManager defaultManager] requestImageForAsset:imageAsset
targetSize:targetSize
contentMode:PHImageContentModeAspectFit
options:options
resultHandler:^(UIImage *img, NSDictionary *info)
{ // code for handle image }];
我尝试使用requestImageDataForAsset
,但对于流式照片,它会返回nil。
答案 4 :(得分:-1)
在8.0为我工作
import Photos
func imageFromAsset(nsurl: NSURL) {
let asset = PHAsset.fetchAssetsWithALAssetURLs([nsurl], options: nil).firstObject as! PHAsset
let targetSize = CGSizeMake(300, 300)
var options = PHImageRequestOptions()
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: PHImageContentMode.AspectFit, options: options, resultHandler: {
(result, info) in
// imageE - UIImageView on scene
self.imageE.image = result
})
}