1

PhotoKit を使用して、次のようなシステム アルバムの 1 つで写真を取得しています。

PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[fetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {
    NSLog(@"ALBUM NAME: %@", collection.localizedTitle);
    if ([collection.localizedTitle isEqualToString:@"Camera Roll"]) {
        PHFetchResult *photos = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
        NSLog(@"PHOTOS: %ld", photos.count);
        _photos = nil;
        _photos = @[].mutableCopy;
        for (PHAsset *asset in photos) {
            [self loadImageFromPHAsset:asset];
        }
    }
}];

次に、カスタム ヘルパー メソッド:(void)loadImageFromPHAsset:(PHAsset *)assetで、次のようにします。

-(void)loadImageFromPHAsset:(PHAsset *)asset
{
    PHImageManager *manager = [PHImageManager defaultManager];
    CGSize targetSize = _layout.itemSize;
    [manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
        [_photos addObject:result];
    }];
    [self.collectionView reloadData];
}

だから私は画像の配列を持っていて、それらを my に提示しますUICollectionViewCell:

UIImage *image = [_photos objectAtIndex:indexPath.row];
cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
cell.imageView.image = image;

しかし、私が得たのはこのようなものです。非常にぼやけています。どうすれば明確にできますか? ここに画像の説明を入力

4

1 に答える 1

2

まず、このように画面のスケールを考慮するために、targetSize にスケールを掛ける必要があります。

CGFloat scale = [UIScreen mainScreen].scale;
CGSize targetSize = CGSizeMake(_layout.itemSize.width*scale, _layout.itemSize.height*scale);

次に、これらのオプションを試して、正確なサイズの画像を取得します。

//Async call returned on main thread, can return multiple times
        
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeExact;

最後に、パフォーマンスに関する懸念がある場合は、PHCachingManager を使用してください。パフォーマンスの改善に関する質問にここで回答しました

これがお役に立てば幸いです。

編集:

画像が配列に格納されていることに気づきませんでした。画像オプションで同期フラグを設定してみてください。

PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
options.resizeMode = PHImageRequestOptionsResizeModeExact;
于 2015-08-15T00:24:47.677 に答える