首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS照片框架

IOS照片框架
EN

Stack Overflow用户
提问于 2017-03-30 09:44:14
回答 3查看 2.7K关注 0票数 9

我想从设备上的所有本地相册中检索所有照片。基本上,设备上的所有照片,本地标识符的列表是否都是唯一的?使用照片框架的最佳方法是什么?

我的问题不是重复的,因为另一个问题也谈到了云资产和设备上没有的资产。当检索图像的实际数据时,它在尝试获取同步时返回空数据。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-16 21:59:48

我想从设备上的所有本地相册中检索所有的照片。基本上所有在设备上的照片

编辑: fetchOptions.includeAssetSourceTypes = .typeUserLibrary见下面的代码

我就是这么做的:

代码语言:javascript
复制
var fetchResult: PHFetchResult<PHAsset>!

...

let fetchOptions = PHFetchOptions()     
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.includeAssetSourceTypes = .typeUserLibrary

fetchResult = PHAsset.fetchAssets(with: fetchOptions)

然后,如果我想将其用作UImage或缩略图(如果您还想将图像用作数据,请使用此let imageData: NSData = UIImagePNGRepresentation(myImage)),则使用:

代码语言:javascript
复制
/* 
 * From an asset to a UIImage, also can be used for thumbnail (if you change the :targetSize:)
 */
func getAsset(_ asset: PHAsset) -> UIImage {

    //var thumbnail = UIImage()
    var imageData = Data()

    let options = PHImageRequestOptions()
    options.isSynchronous = true
    options.deliveryMode = .opportunistic
    options.resizeMode = .fast
    options.isNetworkAccessAllowed = false

    PHImageManager.default().requestImage(for: asset, targetSize: view.frame.size, contentMode: .aspectFill, options: options) { image, info in

      //thumbnail = image!
        imageData: NSData = UIImagePNGRepresentation(image)
    }
    //You can check if the UIImage is nil. If it is nil is an iCloud image
    //return thumbnail
    return imageData
}

您可能会定制以上代码或添加更多的功能,根据您的需要!

上面的代码是用Swift 3.1和Xcode 8.3.1编写和测试的

根据苹果的文档

isNetworkAccessAllowed 指定照片是否可以从iCloud下载请求图像的布尔值。如果为真,则为,并且请求的图像未存储在本地设备上,照片从iCloud下载图像。要获得下载进度的通知,请使用progressHandler属性提供Photos在下载图像时定期调用的块。如果为false (默认值),并且图像不在本地设备上,则结果处理程序信息字典中的PHImageResultIsInCloudKey值表示,除非启用网络访问,否则图像不可用。

使用getAsset()方法从资产中检索图像。它起作用了

票数 3
EN

Stack Overflow用户

发布于 2017-03-30 10:01:53

代码语言:javascript
复制
PHFetchResult *smartAlbums;
smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    for (NSInteger i =0; i < smartAlbums.count; i++)
{
    @autoreleasepool
    {
        PHAssetCollection *assetCollection = smartAlbums[i];
        //Camera Roll
        //All Photos //Moments
        NSLog(@"assetCollection.localizedTitle---%@",assetCollection.localizedTitle);

        // here you will get camera roll photos

        if([assetCollection.localizedTitle isEqualToString:@"Camera Roll"] || [assetCollection.localizedTitle isEqualToString:@"All Photos"] )
        {
            PHFetchOptions *options1 = [[PHFetchOptions alloc] init];
            options1.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
            options1.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeImage];

            // here you will get all assets of your camera roll images in assetsFetchResult
            PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options1];
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-04-17 12:58:22

步骤1.

在项目中嵌入Photos.framework

步骤2

代码语言:javascript
复制
#import <Photos/Photos.h>

步骤3

在plist上添加NSPhotoLibraryUsageDescription键

代码语言:javascript
复制
<key>NSPhotoLibraryUsageDescription</key>
<string>${PRODUCT_NAME} PhotoLibrary Usage</string>

步骤4

编写以下代码以获得PHFetchResult

代码语言:javascript
复制
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

PHFetchResult *tempAssetsFetchResults = [PHAsset fetchAssetsWithOptions:options];
tempAssetsFetchResults = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43114112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档