TSAssetsPickerController是iOS上的一个控件,其工作方式与UIImagePickerController
非常相似。它具有优雅且精心设计的类。
TSAssetsPickerController是一个可以用来选择多个资产(ALAsset对象)的控制器。
有几个主题您需要了解。最重要的类是TSAssetsPickerController
,它是其delegate
和dataSource
,TSFilter
类和TSSizePredicate
类,以及您可以子类化以自定义TSAssetsPickerController UI的UI类。
TSAssetsPickerController使用TSAssetsPickerControllerDelegate
和TSAssetsPickerControllerDataSource
。
委托包含必须实现的方法。这些方法在用户完成选择资产、用户触摸取消以及发生错误时被调用。
有错误的方法在用户禁止访问其相机胶卷时被调用。
当用户完成选择资产时被调用的方法返回ALAsset对象。您可以从这些ALAsset对象中简单地获取图片或视频。
数据源有大量用于配置TAssetsPickerController的方法。您可以使用数据源配置的事项包括:要选择的项目数量、过滤器(之后将描述的TSFilter
)、在所选方向的资产视图布局、获取和完成选择资产的活动指示器外观、相册视图的标题、取消按钮的标题、选择按钮的标题、当没有可用相册时单元格标签的文本、相册的反正序或正常顺序、决定是否显示空相册以及如果应该显示,是否应变暗指向空相册的单元格标题。
最后但同样重要的是你应使用的方法来为可以自定义的类设置子类。
以下表格描述了你可以子类化的类。
类名 | 描述 |
---|---|
AlbumCell |
TSAlbumsViewController 显示的单元格的基础类 - 包含专辑名称的单元格。 |
NoAlbumsCell |
TSAlbumsViewController 在没有可显示专辑时显示的单元格的基础类。 |
AssetsCollectionViewLayout |
在 TSAssetsViewController 中使用的集合视图布局的基础类。 |
AssetsCollectionView |
在 TSAssetsViewController 中使用的 UICollectionView 的基础类。 |
TSFilter
和 TSSizePredicate
TSFilter
在 TSAssetsPickerControllerDataSource
的 - (TSFilter *)filterOfAssetsPickerController:(TSAssetsPickerController *)picker
方法中使用。本类的实例决定了哪种类型的资产以及使用哪些选项来过滤资产。使用非常简单。
可以使用过滤器(Photo
、Video
、All
)创建实例,并可选地添加一个或多个谓词。
过滤器类型用于设置是否仅显示照片、视频或两者。
过滤器还可以接受一个 TSSizePredicate
对象,该对象确定应显示哪些大小的资产。
TSSizePredicate
可以匹配
最全面设计的初始化器具有设置逻辑门的能力。它可以用来设置更具体的过滤器。你可以设置一个接受大小为 小于 512x512 且大于 256x256 的资产的过滤器,或者你可以创建一个接受大小为 小于 512x512 或大于 1024x1024 的资产的过滤器。使用更简单的谓词,你可以设置选择器只接受看起来像屏幕截图的资产,通过设置匹配大小数组的谓词,例如 640x1136, 1136x640, 640x960, 960x640 等。有大量的可能性来设置过滤器。
TSSizePredicate
接受包含在 NSValue 对象中的 CGSize 对象的数组。TSSizePredicate 使用宏 TSSizeValue(width,height)
。
创建 TSAssetsPickerControllerInstnce
。
_picker = [TSAssetsPickerController new];
_picker.delegate = self;
_picker.dataSource = self;
为了响应用户选择器类所执行的操作,必须实现一些选择器代理的方法。
#pragma mark - TSAssetsPickerControllerDelegate
- (void)assetsPickerControllerDidCancel:(TSAssetsPickerController *)picker {
[_picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)assetsPickerController:(TSAssetsPickerController *)picker didFinishPickingAssets:(NSArray *)assets {
[_picker dismissViewControllerAnimated:YES completion:nil];
[DummyAssetsImporter importAssets:assets]; // Here is some class which gets data from ALAssets objects pass into.
}
- (void)assetsPickerController:(TSAssetsPickerController *)picker failedWithError:(NSError *)error {
if (error) {
NSLog(@"Error occurs. Show dialog or something. Probably because user blocked access to Camera Roll.");
}
}
选择器数据源的两种方法也必须实现。
- (NSUInteger)numberOfItemsToSelectInAssetsPickerController:(TSAssetsPickerController *)picker {
return 3;
}
- (TSFilter *)filterOfAssetsPickerController:(TSAssetsPickerController *)picker {
TSSizePredicate *predicate = [TSSizePredicate matchSize:CGSizeMake(320, 480)];
return [TSFilter filterWithType:FilterTypePhoto predicate:predicate];
}
为适当的方向设置布局
- (UICollectioftnViewLayout *)assetsPickerController:(TSAssetsPickerController *)picker needsLayoutForOrientation:(UIInterfaceOrientation)orientation {
AssetsCollectionViewLayout *layout = [AssetsCollectionViewLayout new];
if (UIInterfaceOrientationIsPortrait(orientation)) {
if (IS_IPHONE) {
[layout setItemSize:CGSizeMake(47, 47)];
[layout setItemInsets:UIEdgeInsetsMake(5.0f, 5.0f, 5.0f, 5.0f)];
[layout setInternItemSpacingY:4.0f];
[layout setNumberOfColumns:6];
} else {
[layout setItemSize:CGSizeMake(115, 115)];
[layout setItemInsets:UIEdgeInsetsMake(10.0f, 10.0f, 10.0f, 10.0f)];
[layout setInternItemSpacingY:10.0f];
[layout setNumberOfColumns:6];
}
} else {
if (IS_IPHONE) {
CGSize itemSize = CGSizeMake(48, 48);
if (IS_IPHONE_5) {
itemSize = CGSizeMake(45, 45);
}
[layout setItemSize:itemSize];
[layout setItemInsets:UIEdgeInsetsMake(5.0f, 5.0f, 5.0f, 5.0f)];
[layout setInternItemSpacingY:4.0f];
NSUInteger columns = IS_IPHONE_5 ? 11 : 9;
[layout setNumberOfColumns:columns];
} else {
[layout setItemSize:CGSizeMake(115, 115)];
[layout setItemInsets:UIEdgeInsetsMake(10.0f, 10.0f, 10.0f, 10.0f)];
[layout setInternItemSpacingY:10.0f];
[layout setNumberOfColumns:8];
}
}
return layout;
}
在用户选择器获取数据并且完成选择时,在专辑和资产视图中都显示 UIActivityIndicatorView
。
- (UIActivityIndicatorView *)assetsPickerController:(TSAssetsPickerController *)picker activityIndicatorViewForPlaceIn:(ViewPlace)place {
UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[indicatorView setColor:[UIColor redColor]];
[indicatorView setHidesWhenStopped:YES];
return indicatorView;
}
数据源的其他可选方法。
- (NSString *)assetsPickerControllerTitleForAlbumsView:(TSAssetsPickerController *)picker {
return @"Albums";
}
- (NSString *)assetsPickerControllerTitleForCancelButtonInAlbumsView:(TSAssetsPickerController *)picker {
return @"Cancel";
}
- (NSString *)assetsPickerControllerTitleForSelectButtonInAssetsView:(TSAssetsPickerController *)picker {
return @"Select";
}
- (NSString *)assetsPickerControllerTextForCellWhenNoAlbumsAvailable:(TSAssetsPickerController *)picker {
return @"Can't find any asset. Create some and back.";
}
- (BOOL)assetsPickerControllerShouldShowEmptyAlbums:(TSAssetsPickerController *)picker {
return YES;
}
- (BOOL)assetsPickerControllerShouldDimmCellsForEmptyAlbums:(TSAssetsPickerController *)picker {
return NO;
}
- (BOOL)assetsPickerControllerShouldReverseAlbumsOrder:(TSAssetsPickerController *)picker {
return YES;
}
TSAssetsPickerController
需要 ARC 并且仅在 iOS6 和 iOS7 上运行。
要安装并使用 TSAssetsPickerController
,您必须将 Classes
目录添加到您的项目中。如果不是从 CocoaPods 安装,应该包含三个文件夹:Controllers
、Customizable Classes
和 API Classes
。之后,您需要导入 TSAssetsPickerController
。它会导入所有需要工作的类。
#import "TSAssetsPickerController.h"
如果你喜欢这个项目,可以捐赠它 :)
UICollectionFlowLayout
替换为 UICollectionViewLayout
。现在可以通过 TSAssetsPickerController
的数据源来设置布局。TSAssetsViewController
中 UICollectionView
不正确的高度。thumbnailImageView
和 movieMarkImageView
现在可以正确更新布局。TSFilter
在向用户显示之前过滤资产。TSAssetsPickerController
的属性已移至数据源。TSAssetsPickerController
的 Podspec。现在可在 CocoaPods 中找到。TSAssetsPickerController 可在 Apache 2.0 许可证下使用。
版权所有 © 2014 Tomasz Szulc
根据 Apache 许可证 2.0 版(“许可证”);除非法律要求或书面同意,否则不得使用此文件,除非遵守许可证。可以在以下地址获得许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件是根据“现状”的基础分发的,不提供任何明示或暗示的保证或条件。有关许可证的具体语言管辖权限和限制,请参阅许可证。