iOS*_*eek 3 objective-c uiimage ios phasset
我已将一些转换PHAsset为UIImage:
PHImageManager *manager = [PHImageManager defaultManager];
[manager requestImageForAsset:asset
targetSize:PHImageManagerMaximumSize
contentMode:PHImageContentModeDefault
options:requestOptions
resultHandler:^void(UIImage *image, NSDictionary *info) {
convertedImage = image;
[images addObject:convertedImage];
}];
Run Code Online (Sandbox Code Playgroud)
现在我想做那样的事情:
[selectedAssets removeObject:image];
Run Code Online (Sandbox Code Playgroud)
其中selectedAssets是的阵列PHAsset和image是UIImage
所以我已经实现了isEqual:
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![[other class] isEqual:[self class]])
return NO;
NSData *data1 = UIImagePNGRepresentation(self.image);
NSData *data2 = UIImagePNGRepresentation(((TINSelectedImage*)other).image);
return [data1 isEqual:data2];
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用!
您不应该比较图像,而应该比较PHAssets或它们唯一有用的部分名为localIdentifier.
您正在寻找区分资产的东西称为PHAsset的localIdentifier属性.
Apple Docs将其定义为:
A unique string that persistently identifies the object. (read-only)
Run Code Online (Sandbox Code Playgroud)
对不起,这个答案有点宽泛,因为我不喜欢你的方法.
如果我是你,我会这样做:
首先创建一个自定义类,我们将其命名为PhotoInfo.(如果您不想保留有关照片的大量信息,则不必执行此操作.如果是这种情况,请根据需要直接使用PHAssets的PFFetchResults.但我会使用CustomClass).
在PhotoInfo.h中:
#import <Foundation/Foundation.h>
@interface PhotoInfo : NSObject
@property NSString *localIdentifier;
@end
Run Code Online (Sandbox Code Playgroud)
现在不使用图像数组,而是使用您创建的包含localIdentifier的自定义类.像这样:
PhotoInfo *photo = [[PhotoInfo alloc] init];
photo.localIdentifier = asset.localIdentifier;
Run Code Online (Sandbox Code Playgroud)
假设您想要从图库中获取图像,您可以执行以下操作:
-(PHFetchResult*) getAssetsFromLibrary
{
PHFetchResult *allPhotos;
PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; //Get images sorted by creation date
allPhotos = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:allPhotosOptions];
return allPhotos;
}
Run Code Online (Sandbox Code Playgroud)
要填充dataSource,您可以执行以下操作:
NSMutableArray *yourPhotoDataSource = [[NSMutableArray alloc] init];
PHFetchResult * assets = [self getAssetsFromLibrary];
for(PHAsset *asset in assets)
{
PhotoInfo *photo = [PhotoInfo new];
photo.localIndentifier = asset.localIdentifier;
[yourPhotoDataSource addObject:photo];
}
Run Code Online (Sandbox Code Playgroud)
现在让我们假设您必须在某处显示这些图像,并且您需要一个实际图像,以便您可以执行以下操作来获取图像:
-(void) getImageForAsset: (PHAsset *) asset andTargetSize: (CGSize) targetSize andSuccessBlock:(void (^)(UIImage * photoObj))successBlock {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
PHImageRequestOptions *requestOptions;
requestOptions = [[PHImageRequestOptions alloc] init];
requestOptions.resizeMode = PHImageRequestOptionsResizeModeFast;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
requestOptions.synchronous = true;
PHImageManager *manager = [PHImageManager defaultManager];
[manager requestImageForAsset:asset
targetSize:targetSize
contentMode:PHImageContentModeDefault
options:requestOptions
resultHandler:^void(UIImage *image, NSDictionary *info) {
@autoreleasepool {
if(image!=nil){
successBlock(image);
}
}
}];
});
}
Run Code Online (Sandbox Code Playgroud)
现在假设您正在tableView中显示这些图像,在您的cellForRowAtIndexPath中,调用上面提到的方法如下:
//Show a spinner
// Give a customizable size for image. Why load the memory with full image if you don't need to show it?
[self getImageForAsset:asset andTargetSize:yourDesiredCGSizeOfImage andSuccessBlock:^(UIImage *photoObj) {
dispatch_async(dispatch_get_main_queue(), ^{
//Update UI of cell
//Hide the spinner
cell.thumbNail.image = photoObj;
});
}];
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过平滑的用户体验异步加载图像,并通过仅显示所需的图像而不是存储所有图像来节省内存.(通过引入缓存可以使性能更好,但这不是重点).
最后回答您的问题,要删除某个图像,您只需要localIdentifier,因为它对每个PHAsset或Index都是唯一的.
假设您正在删除tableView上的某个单元格,该单元格显示您现在要删除的特定图像.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
PhotoInfo *photo = [yourPhotoDataSource objectAtIndex:indexPath.row];
[yourPhotoDataSource removeObject:photo];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
}
Run Code Online (Sandbox Code Playgroud)
如果您没有使用TableView/CollectionView并且不知道对象的索引,则可以在数组上使用快速枚举,但是您必须知道要删除的对象的localIdentifier:
-(void) deletePhotoWithIdentifier:(NSString *) identifierStr{
NSMutableArray *dummyArray = [[NSMutableArray alloc] initWithArray:yourPhotoDataSource]; //created because we can't modify the array we are iterating on. Otherwise it crashes.
[dummyArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(PhotoInfo *p, NSUInteger index, BOOL *stop) {
if ([p.localIndentifier isEqualToString:idenfierStr]) {
[yourPhotoDataSource removeObjectAtIndex:index];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2140 次 |
| 最近记录: |