如何从照片自定义相册中获取图像,iOS SDK?

2023-12-21

I'm working on an iOS app in which I need gallery view like Instagram. I have added gallery View, camera View and video View, after taking image it saves to custom album of Photos. Now I want to retrieve those images from custom album and show it to Collection view of Gallery. But I'm getting stuck in retrieving those images from custom album. Any help will be appreciated. Check image for ref.

编辑: 我添加了 PHPhotoLibrary 用于创建自定义相册,在此之前我添加了 AssetsLibrary 框架。

然后我创建了一个 NSObject 类(CustomAlbum),用于使用 PHPhotoLibrary 创建和管理自定义相册。

// 自定义相册.h

#import <Foundation/Foundation.h>
#import <Photos/Photos.h>


@interface CustomAlbum : NSObject

//Creating album with given name
+(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError;

//Get the album by name
+(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName;

//Add a image
+(void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError;

//get the image using identifier
+ (void)getImageWithIdentifier:(NSString*)imageId onSuccess:(void(^)(UIImage *image))onSuccess onError: (void(^)(NSError * error)) onError;


@end

// 自定义相册.m

#import "CustomAlbum.h"

@implementation CustomAlbum

#pragma mark - PHPhoto

+(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError
{
    //Check weather the album already exist or not
    if (![self getMyAlbumWithName:title]) {
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            // Request editing the album.
            PHAssetCollectionChangeRequest *createAlbumRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];

            // Get a placeholder for the new asset and add it to the album editing request.
            PHObjectPlaceholder * placeHolder = [createAlbumRequest placeholderForCreatedAssetCollection];
            if (placeHolder) {
                onSuccess(placeHolder.localIdentifier);
            }

        } completionHandler:^(BOOL success, NSError *error) {
            NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
            if (error) {
                onError(error);
            }
        }];
    }
}

+(void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError
{
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // Request creating an asset from the image.
        PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

        // Request editing the album.
        PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album];

        // Get a placeholder for the new asset and add it to the album editing request.
        PHObjectPlaceholder * placeHolder = [createAssetRequest placeholderForCreatedAsset];
        [albumChangeRequest addAssets:@[ placeHolder ]];

        NSLog(@"%@",placeHolder.localIdentifier);
        if (placeHolder) {
            onSuccess(placeHolder.localIdentifier);
        }

    } completionHandler:^(BOOL success, NSError *error) {
        NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
        if (error) {
            onError(error);
        }
    }];
}


+(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName
{
    #if 0
    NSString * identifier = [[NSUserDefaults standardUserDefaults]objectForKey:kAlbumIdentifier];
    if (!identifier) return nil;
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[identifier]
                                                                                           options:nil];
    #else
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                                               subtype:PHAssetCollectionSubtypeAlbumRegular
                                                                               options:nil];
    #endif
    NSLog(@"assetCollections.count = %lu", assetCollections.count);
    if (assetCollections.count == 0) return nil;

    __block PHAssetCollection * myAlbum;
    [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *album, NSUInteger idx, BOOL *stop) {
        NSLog(@"album:%@", album);
        NSLog(@"album.localizedTitle:%@", album.localizedTitle);
        if ([album.localizedTitle isEqualToString:AlbumName]) {
            myAlbum = album;
            *stop = YES;
        }
    }];

    if (!myAlbum) return nil;
    return myAlbum;
}

+(NSArray *)getAssets:(PHFetchResult *)fetch
{
    __block NSMutableArray * assetArray = NSMutableArray.new;
    [fetch enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
        NSLog(@"asset:%@", asset);
        [assetArray addObject:asset];
    }];
    return assetArray;
}



+ (void)getImageWithIdentifier:(NSString*)imageId onSuccess:(void(^)(UIImage *image))onSuccess onError: (void(^)(NSError * error)) onError
{
    NSError *error = [[NSError alloc] init];
    PHFetchResult *assets = [PHAsset fetchAssetsWithLocalIdentifiers:@[imageId] options:nil];
    if (assets.count == 0) onError(error);

    NSArray * assetArray = [self getAssets:assets];
    PHImageManager *manager = [PHImageManager defaultManager];
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [manager requestImageForAsset:assetArray.firstObject targetSize:screenRect.size contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        onSuccess(result);
    }];
}

@end

然后使用此方法单击图像按钮来创建自定义相册并将图像保存在该自定义相册中。

 // Take Image Button Method

- (void)snapButtonPressed:(UIButton *)button
{
    [self.camera capture:^(LLSimpleCamera *camera, UIImage *image,
                           NSDictionary *metadata, NSError *error)
     {
         if(!error)
         {
             NSString * info = [NSString stringWithFormat:@"Size: %@  -  Orientation: %ld", NSStringFromCGSize(image.size), (long)image.imageOrientation];

             [CustomAlbum addNewAssetWithImage:image toAlbum:[CustomAlbum getMyAlbumWithName:CSAlbum] onSuccess:^(NSString *ImageId) {
                 NSLog(@"%@",ImageId);
                 recentImg = ImageId;
             } onError:^(NSError *error) {
                 NSLog(@"probelm in saving image");
             }];
         }
         else
         {
             NSLog(@"An error has occured: %@", error);
         }
     }
          exactSeenImage:YES];
}

这是有效的代码。

__block PHAssetCollection *collection;

// Find the album
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", @"YOUR_CUSTOM_ALBUM_NAME"];
collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                  subtype:PHAssetCollectionSubtypeAny
                                                  options:fetchOptions].firstObject;

PHFetchResult *collectionResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];

[collectionResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {


    //add assets to an array for later use in the uicollectionviewcell

}];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从照片自定义相册中获取图像,iOS SDK? 的相关文章

  • 使用基于约束的布局自动调整 NSTokenField 的大小

    有没有办法自动调整大小height使用约束的 NSTokenField 保持宽度恒定 sizeToFit应该有效 但事实并非如此 如果我设置一个约束来保持宽度不变并调用此方法 它将忽略约束并仅调整宽度大小 当我想要的是仅调整高度大小时 基于
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们
  • 为沙盒 Cocoa 应用程序创建临时文件

    我的应用程序是沙箱化的 根据最新的应用程序商店指南 我想创建一些临时文件 我可以这样做吗 如果 是 我可以在哪里这样做 有没有预先指定的路径 还有访问该路径的命令 您应该使用NSTemporaryDirectory 函数 它将查找并返回适合
  • ui 测试 xcode,如何使用 cellquery 点击表视图单元格按钮

    我目前正在为我的应用程序进行 ui 测试 并一直点击我的应用程序的登录按钮 我无法找到我提供了标识符注册按钮的元素 该元素是索引中的第三个 这不是问题 let cellQuery self app tables cells element
  • iOS 13 beta 外部屏幕上的 OverscanCompensation

    我正在测试一个应用程序的测试版 但遇到了外部屏幕的问题 我们看到应用程序周围有黑色边框 我们之前可以通过设置来纠正它overscanCompensation to none但在 iOS 13 中 该设置根本没有任何效果 我们曾经看到一个错误
  • 核心数据 NSFetchRequest 还获取实体的子对象

    我是 iOS 开发和 Core Data 的新手 我有一个父 NSManagedObject class Units interface Properties NSManagedObject property nonatomic retai
  • 如何在iOS应用程序中捕获用户的手写签名[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我的应用程序中 用户将请求客户提供数字化的手写签名 我需要能够在用户在触摸屏上 书写 签名时捕获签名
  • 如果我的消耗性 IAP 被退款,我会收到任何通知吗?

    我有 Apple iOS 应用程序 其中有很多消耗性 IAP 我非常担心用户购买IAP并使用一段时间后向Apple客服投诉并获得退款 如果我的消耗品 IAP 退款 我会收到任何通知吗 我如何注意到这一点并阻止用户使用 IAP None
  • 我可以更改键盘方向吗?

    例如我用这段代码关闭自动旋转 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation return NO BOOL sh
  • 如何提高包含大量小图像的 UCollectionView 的性能?

    在我的 iOS 应用程序中我有UICollectionView显示大约 1200 个小 35x35 点 图像 图像存储在应用程序包中 我正确地重用了UICollectionViewCell但仍然存在性能问题 具体取决于我处理图像加载的方式
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Objective-C中如何使继承的类能够看到父类的隐藏方法[重复]

    这个问题在这里已经有答案了 我有两个类 Class1 和 Class2 第二个类继承自第一个类 我需要重写 Class1 的 update 方法来实现我的目标 继承方法中 update方法的改变是在代码中间进行的 所以我不能使用 超级更新
  • CBPeripheral 名称有时为 null

    我正在开发一个应用程序来与蓝牙 LE 外围设备进行通信 我目前正在测试的外围设备是其中之一these http www ti com tool cc2540dk mini 有趣的是 有时当我发现它时 我会得到它的正确名称 SimpleBLE
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • -[EAGLContext renderbufferStorage:fromDrawable:] 第二次失败?

    我正在开发一个 iOS openGL ES 应用程序 我正在做通常的 EAGLView ES2Render 的事情 启动时 使用以下代码成功创建 frambuffer BOOL createFramebuffers EAGLContext
  • iOS Storyboards 我应该使用它们吗? [复制]

    这个问题在这里已经有答案了 我是 iOS 开发新手 尚未创建应用程序 但我向我的朋友寻求建议 他在市场上拥有非常高评价的应用程序 他说不要使用故事板 尽管我很想听取他的建议 但它们似乎确实很有帮助 这是否会在将来给我的应用程序带来问题 我有
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • MySQL中反斜杠\算作一个字符吗?

    如果我有一个包含固定长度列的表 mySQL 会将反斜杠算作字符吗 例子 people name 10 age 3 如果我在名称列中存储 MySQL 转义值 例如 Blahblah sMySQL会按照报价砍掉它吗 Thanks 不 转义字符不
  • 如何实际重置 $httpBackend 期望?

    我已经尝试过并试图让它发挥作用 这文档 https docs angularjs org api ngMock service 24httpBackend充其量是简洁的 重置期望 重置所有请求期望 但保留所有后端定义 通常 当您想要重用 h
  • 信号分配在进程中如何工作?

    我了解到信号在遇到表达式时不会立即改变 而是在进程结束时立即改变 在此示例中 signal x y z bit process y begin x lt y z lt not x end process 这个例子是这样说的 如果信号 y 发
  • 我无法获得正确的 StoreContext

    我已将我的应用程序提交到 Windows 应用商店并通过了认证 根据测试说明 https learn microsoft com en us windows uwp monetize in app purchases and Trials
  • 如何配置简单注入器 IoC 以使用 RavenDB

    我在用着简易注射器 http simpleinjector codeplex com用于 MVC 3 Web 应用程序中的 IOC 我在用RavenDB http ravendb net用于数据存储 在 mvc 3 应用程序中使用 Rave
  • Spyder 中的简单 Python 多重处理函数不输出结果

    我在这里有一个非常简单的函数 我试图在其中运行和测试 但是 它不会输出任何内容 也没有任何错误 我多次检查了代码 但没有任何错误 我打印了作业 这就是我得到的
  • 阻止对 Redis 密钥的访问 (ServiceStack)

    我正在尝试使用 ServiceStack Redis 客户端来实现我认为非常常见的缓存场景 但我很难找到一个很好的例子 在 ASP NET MVC 应用程序中 我们对外部 Web 服务进行相对长时间运行 且按计量 的调用 并将结果缓存一段时
  • 函数调用中的多个括号

    我对这个 Scala 表示法有点困惑 List 1 2 3 foldLeft 0 x acc gt acc x 0 和函数都是foldLeft的参数 为什么它们被传递到两个相邻的括号组中 我认为这是可行的 List 1 2 3 foldLe
  • XNA 与 DirectX 的比较 (C#)

    在PC开发方面 不包括Xbox和Zune XNA 和 C DirectX 有什么区别 C DirectX 是否比 XNA 具有显着优势 在速度 版税等方面 与非托管 C DirectX 相比 两者的速度如何 游戏编程行业正在走向何方 如果您
  • if 语句之外的变量访问

    我正在尝试访问 java 中 if 语句之外的变量 变量是axeMinDmg 这是我所拥有的 但出现错误 我想minDmg axeMinDmg thanks SuppressWarnings unused public static voi
  • 我应该使用哪种算法进行信号(声音)一类分类?

    Update我总结了问题及其答案here https jaderdias github io posts signal one class classification 我的目标是检测噪声信号中给定模式的存在 我想检测一种用麦克风记录声音的
  • 无论 Zsh 中的上下文如何,都将密钥绑定到完整的文件名

    有时我想要一个文件名 而不是 zsh 为我猜测的文件名 例如 我有一个 PNG 文件 没有正确的 png后缀 这会让 zsh 认为它不是图片 并且在我输入时不会列出它Tab完成论证display 我想知道是否有一个关键序列可以在上下文所在的
  • 如何在WebFilter的实现中获取路径变量? (服务器网络交换)

    我在 Spring Reactive 应用程序中工作 我知道如何使用 HttpServletRequest 在拦截器中获取 PathVariable 有些类似 request getAttribute HandlerMapping URI
  • 如何使 LWP::UserAgent 看起来像另一个浏览器?

    这是我关于 SO 的第一篇文章 所以要温柔 我什至不确定这是否属于这里 但就在这里 我想访问我的一个个人帐户上的一些信息 该网站写得不好 需要我手动输入我想要的信息的日期 这确实是一种痛苦 我一直在寻找一个学习更多 Perl 的借口 所以我
  • 带有参数的量角器“addMockModule()”在 Firefox 中无法正确处理结构化数据

    我最近阅读了有关这些量角器问题的解决方案 无法轻松地将上下文传递给addMockModule 695 https github com angular protractor issues 695 feat addMockModule 添加第
  • Angular ng-click 不适用于 $compile

    我有类似于下面的代码来触发clickAngular 应用程序中的事件 为什么事件没有触发 var app angular module myApp app directive myTop function compile return re
  • Scala问题可选构造函数

    想象一下这段简单的代码 class Constructor var string String def this s String this string s def testMethod println string testMethod
  • 如何在xamarin中浏览sqlite数据?

    我的应用程序中有一个列表视图 一些数据在填充列表视图之前保存到数据库中 我的问题是看不到数据 以及如何验证数据是否存储在数据库中 我给出了 Visual Studio 2015 的解决方案 适用于 Xamarin 找到上图中提到的数据库文件
  • Twitter4j:调用 getFollowersIDs 时出现不一致的身份验证错误

    我正在使用 Twitter4j 版本 3 0 3 我正在尝试提取关注者 ID 并使用 OAuth 我已经使用 Twitter4j 多年 并且对该框架比较有经验 然而 奇怪的事情发生了 我的程序将运行良好 然后间歇性地抛出以下堆栈跟踪 Exc
  • 如何从照片自定义相册中获取图像,iOS SDK?

    I m working on an iOS app in which I need gallery view like Instagram I have added gallery View camera View and video Vi