探索CTAssetsPickerController:高效的照片和视频选择器
CTAssetsPickerController是一个强大的iOS库,它允许用户从照片库中挑选多张图片和视频,其用户体验和外观与UIImagePickerController极其相似。这个库基于ARC,并且依赖于苹果的AssetsLibrary框架。
THE 0TH POSITION OF THE ORIGINAL IMAGE
项目亮点
- 支持选择多个照片和视频。
- 可以过滤资产,只选择照片或视频。
- 能设置最多可选资产的数量限制。
- 平均处理速度达到每秒5帧,运行效率高。
- 遵循UIAccessibility协议,提供无障碍功能。
最低需求
- Xcode 5
- iOS 6 或更高版本
安装
使用CocoaPods
首先安装CocoaPods(如果尚未安装):
$ [sudo] gem install cocoapods
$ pod setup
创建Podfile并添加依赖:
$ edit Podfile
platform :ios, '6.0'
pod 'CTAssetsPickerController', '~> 1.5.0'
$ pod install
之后,使用.xcworkspace文件代替.xcodeproj进行开发。
使用Git子模块
$ git submodule add http://github.com/chiunam/CTAssetsPickerController
- 将
CTAssetsPickerController文件夹拖入你的项目,并将其添加到你的目标中。 - 添加
AssetsLibrary.framework。
使用方法
查看Demo Xcode项目获取详细信息。
引入库头文件
如果你使用CocoaPods:
#import <CTAssetsPickerController.h>
如果你使用子模块:
#import "CTAssetsPickerController.h"
创建并显示CTAssetsPickerController
CTAssetsPickerController *picker = [[CTAssetsPickerController alloc] init];
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
自定义配置
你可以设置最大选择数来限制可选的资产数量:
picker.maximumNumberOfSelections = 10;
若只想选择照片或视频,可以创建一个ALAssetsFilter并赋值给assetsFilter:
picker.assetsFilter = [ALAssetsFilter allPhotos]; // 仅选择照片
如果需要根据特定条件筛选可选的资产,可以通过NSPredicate设置selectionFilter,不匹配的资产将不可选:
// 只允许时长超过5秒的视频片段
picker.selectionFilter = [NSPredicate predicateWithBlock:^BOOL(ALAsset* asset, NSDictionary *bindings) {
if ([[asset valueForProperty:ALAssetPropertyType] isEqual:ALAssetTypeVideo]) {
NSTimeInterval duration = [[asset valueForProperty:ALAssetPropertyDuration] doubleValue];
return duration >= 5;
} else {
return YES;
}
}];
在popover中显示时,可以隐藏取消按钮:
picker.showsCancelButton = NO;
展示空相册:
picker.showsEmptyGroups = YES;
实现CTAssetsPickerControllerDelegate
代理方法负责在操作完成后关闭选择器。调用呈现选择器控制器的dismissViewControllerAnimated:completion:方法来关闭它。请参考示例应用了解详细情况。
didFinishPickingAssets
用户完成选取照片或视频后调用:
- (void)assetsPickerController:(CTAssetsPickerController *)picker didFinishPickingAssets:(NSArray *)assets;
// assets包含ALAsset对象
didCancel(可选)
用户取消选取操作时调用:
- (void)assetsPickerControllerDidCancel:(CTAssetsPickerController *)picker;
didSelectItemAtIndexPath(可选)
用户选择了指定索引路径的项时调用:
- (void)assetsPickerController:(CTAssetsPickerController *)picker didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
// picker.indexPathsForSelectedItems包含了已选择项的索引路径
didDeselectItemAtIndexPath(可选)
用户取消选择指定索引路径的项时调用:
- (void)assetsPickerController:(CTAssetsPickerController *)picker didDeselectItemAtIndexPath:(NSIndexPath *)indexPath;
didHighlightItemAtIndexPath(可选)
用户突出显示了指定索引路径的项时调用:
- (void)assetsPickerController:(CTAssetsPickerController *)picker didHighlightItemAtIndexPath:(NSIndexPath *)indexPath;
didUnhighlightItemAtIndexPath(可选)
用户取消突出显示了指定索引路径的项时调用:
- (void)assetsPickerController:(CTAssetsPickerController *)picker didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath;
注意事项
CTAssetsPickerController不会压缩所选的图片和视频,你可以通过defaultRepresentation属性对选定的资产进行处理。例如,可以这样从选定的资产创建UIImage:
ALAssetRepresentation *representation = alAsset.defaultRepresentation;
UIImage *fullResolutionImage =
[UIImage imageWithCGImage:representation.fullResolutionImage
scale:1.0f
orientation:(UIImageOrientation)representation.orientation];
或者创建选定视频的NSData:
ALAssetRepresentation *representation = alAsset.defaultRepresentation;
NSURL *url = representation.url;
AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
AVAssetExportSession *session =
[AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetLowQuality];
session.outputFileType = AVFileTypeQuickTimeMovie;
session.outputURL = VIDEO_EXPORTING_URL;
[session exportAsynchronouslyWithCompletionHandler:^{
if (session.status == AVAssetExportSessionStatusCompleted) {
NSData *data = [NSData dataWithContentsOfURL:session.outputURL];
}
}];
请查阅ALAssetRepresentation和AVAssetExportSession的文档了解更多细节。
许可证
该项目遵循MIT许可证。
版权所有 (c) 2013 Clement CN Tsang
特此免费授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的人许可,不受限制地使用本软件,包括无限制地使用、复制、修改、合并、发布、分发、再授权和/或销售软件的副本,以及制作与软件相关的派生作品,但需遵守以下条件:
上述版权声明和许可通知应包含在所有副本或实质部分中。
本软件“按原样”提供,没有任何形式的保证,无论是明示还是暗示,包括但不限于关于适销性、针对特定目的的适用性、不侵权或其他可执行性的默示保证。在任何情况下,作者或版权持有者都应对因使用本软件或与之相关的交易而产生的直接、间接、特殊、附带或后果性的损害承担责任,无论是在合同、侵权法或其他情况下。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



