MST

星途 面试题库

面试题:Objective-C中如何获取Photo Library的权限并展示照片列表

请简述在Objective-C项目里,获取用户访问Photo Library权限的流程,并且说明如何将获取到的照片以列表形式展示在视图上,需要提及关键的类和方法。
48.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 获取用户访问Photo Library权限流程
    • 引入框架:在项目中引入Photos.framework
    • 检查权限:使用PHPhotoLibrary类的authorizationStatus类方法来检查当前应用对照片库的访问权限状态。示例代码如下:
#import <Photos/Photos.h>
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusNotDetermined) {
    // 尚未决定权限
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        // 处理授权结果
        if (status == PHAuthorizationStatusAuthorized) {
            // 授权成功
        } else {
            // 授权失败
        }
    }];
} else if (status == PHAuthorizationStatusAuthorized) {
    // 已经授权
} else {
    // 授权被拒绝或限制
}
  1. 将获取到的照片以列表形式展示在视图上
    • 关键类和方法
      • PHFetchResult:用于表示符合特定条件的媒体资源集合。通过PHAsset的类方法fetchAssetsWithOptions:等获取照片资源的集合。例如,获取所有照片资源:
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:options];
 - **`PHCachingImageManager`类**:用于高效地缓存和加载图像。通常使用`requestImageForAsset:targetSize:contentMode:options:resultHandler:`方法来获取`PHAsset`对应的图像。示例代码如下:
PHCachingImageManager *imageManager = [[PHCachingImageManager alloc] init];
CGSize targetSize = CGSizeMake(200, 200);
[imageManager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
    // 将result显示到视图上
}];
  • 展示在视图上
    • 可以使用UICollectionView来展示照片列表。在UICollectionViewcellForItemAtIndexPath:方法中,根据PHFetchResult中的PHAsset获取图像并显示在UICollectionViewCellUIImageView上。示例代码如下:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    PHAsset *asset = self.assets[indexPath.item];
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    options.synchronous = YES;
    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(200, 200) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];
        imageView.image = result;
    }];
    return cell;
}

这里假设UICollectionViewCell中有一个UIImageView,其tag为100 。同时,self.assets是存储PHAssetPHFetchResult对象。