iOS 中的资产库问题 - 5
Posted
技术标签:
【中文标题】iOS 中的资产库问题 - 5【英文标题】:Asset Library issue in iOS - 5 【发布时间】:2012-06-13 09:26:33 【问题描述】:我正在使用资产库从 url 获取图像,我的代码是
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
UIImage *largeimage;
if (iref)
largeimage = [UIImage imageWithCGImage:iref];
[self customeButtonCreated:self];
NSData* thumbImageData = [[NSData alloc] initWithContentsOfFile:imagePath];
btn1.frame = CGRectMake(x, y, WIDTH, HEIGHT);
[btn1 setTag:tag];
//[media_id addObject:[allKey objectAtIndex:0]];
[btnURl addObject:imagePath];
UIImage *tempImage = [[UIImage alloc]initWithData:thumbImageData];
[btn1 setImage:largeimage forState:UIControlStateNormal];
btn1.imageView.contentMode = UIViewContentModeScaleAspectFit;
[tempImage release];
[newView addSubview:btn1];
[btn1 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[thumbImageData release];
imgcount++;
NSLog(@"Iamge count ---%d",imgcount);
tag++;
;
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
NSLog(@"Cannot get image - %@",[myerror localizedDescription]);
;
if ([seprateArr count] == 2)
NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"assets-library://asset/asset.JPG?id=%@&ext=%@",[seprateArr objectAtIndex:0],[seprateArr objectAtIndex:1]]];
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock];
它在 ios - 4 或更低版本中运行良好,但在 ios - 5 中它没有进入块并显示错误
无法获取图像 - 全局拒绝访问
有什么解决办法吗?
【问题讨论】:
【参考方案1】:这适用于我在 ios 4.0 和 ios 5 中。
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSString *photoName;
NSString *photoUrl;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
if(result != NULL)
NSArray *arrKeys = [[result valueForProperty:ALAssetPropertyURLs]allKeys];
if([[result valueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto])
if([[UIDevice currentDevice] systemVersion]>=5.0))
photoName = [[result defaultRepresentation]UTI];
else
photoName = [[result defaultRepresentation]filename];
//Your code here
photoUrl = [[result valueForProperty:ALAssetPropertyURLs]objectForKey:[arrKeys objectAtIndex:0]];
;
void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
if(group != nil)
[group enumerateAssetsUsingBlock:assetEnumerator];
;
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:^(NSError *error)
NSLog(@"%@",error);
];
[pool release];
【讨论】:
这里的 photoName 是什么?图片名称? 意味着我必须使用 [UIImage imageNamed:photoName]; photoName 是图像的标题,而 photoUrl 是它的资产 url。你可以像这样访问 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL fileURLWithPath:photoUrl]]]; 我可以在哪里使用 photoName ?它的数据类型是什么?我在哪里可以申报? 它是图像的标题,你可以在 tableview 中显示所有标题,每个标题都有资产 url。或在显示所有图像的滚动视图中,每个图像下方都有显示其标题的标签以上是关于iOS 中的资产库问题 - 5的主要内容,如果未能解决你的问题,请参考以下文章
React Native 0.26 显示资产库中的图像时找不到合适的图像 URL 加载器