TSAssetsPickerController 1.2

TSAssetsPickerController 1.2

测试已测试
Lang语言 Obj-CObjective C
许可证 自定义
发布上次发布2014年12月

未归属 维护。



 

TSAssetsPickerController是iOS上的一个控件,其工作方式与UIImagePickerController非常相似。它具有优雅且精心设计的类。

概述

TSAssetsPickerController是一个可以用来选择多个资产(ALAsset对象)的控制器。

特性

  • 浏览所有相册
  • 资产过滤(类型、大小)
  • 支持所有方向
  • 支持iOS6、iOS7
  • 支持iPhone、iPad
  • 允许从单个相册中选择多个资产
  • 自定义相册和资产的顺序
  • 提供了大量选项来设置。
  • 容易应用到项目中
  • 容易自定义

API快速入门

有几个主题您需要了解。最重要的类是TSAssetsPickerController,它是其delegatedataSourceTSFilter类和TSSizePredicate类,以及您可以子类化以自定义TSAssetsPickerController UI的UI类。

TSAssetsPickerController使用TSAssetsPickerControllerDelegateTSAssetsPickerControllerDataSource


TSAssetsPickerControllerDelegate

委托包含必须实现的方法。这些方法在用户完成选择资产、用户触摸取消以及发生错误时被调用。

有错误的方法在用户禁止访问其相机胶卷时被调用。

当用户完成选择资产时被调用的方法返回ALAsset对象。您可以从这些ALAsset对象中简单地获取图片或视频。

TSAssetsPickerControllerDataSource

数据源有大量用于配置TAssetsPickerController的方法。您可以使用数据源配置的事项包括:要选择的项目数量、过滤器(之后将描述的TSFilter)、在所选方向的资产视图布局、获取和完成选择资产的活动指示器外观、相册视图的标题、取消按钮的标题、选择按钮的标题、当没有可用相册时单元格标签的文本、相册的反正序或正常顺序、决定是否显示空相册以及如果应该显示,是否应变暗指向空相册的单元格标题。

最后但同样重要的是你应使用的方法来为可以自定义的类设置子类

子类化的类

以下表格描述了你可以子类化的类。

类名 描述
AlbumCell TSAlbumsViewController 显示的单元格的基础类 - 包含专辑名称的单元格。
NoAlbumsCell TSAlbumsViewController 在没有可显示专辑时显示的单元格的基础类。
AssetsCollectionViewLayout TSAssetsViewController 中使用的集合视图布局的基础类。
AssetsCollectionView TSAssetsViewController 中使用的 UICollectionView 的基础类。

TSFilterTSSizePredicate

TSFilterTSAssetsPickerControllerDataSource- (TSFilter *)filterOfAssetsPickerController:(TSAssetsPickerController *)picker 方法中使用。本类的实例决定了哪种类型的资产以及使用哪些选项来过滤资产。使用非常简单。

可以使用过滤器(PhotoVideoAll)创建实例,并可选地添加一个或多个谓词。

过滤器类型用于设置是否仅显示照片、视频或两者。

过滤器还可以接受一个 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 安装,应该包含三个文件夹:ControllersCustomizable ClassesAPI Classes。之后,您需要导入 TSAssetsPickerController。它会导入所有需要工作的类。

#import "TSAssetsPickerController.h"

捐赠 图片

如果你喜欢这个项目,可以捐赠它 :)

变更日志

1.2 (02.03.2014)
  • UICollectionFlowLayout 替换为 UICollectionViewLayout。现在可以通过 TSAssetsPickerController 的数据源来设置布局。
  • 添加了在检索相册和资产以及选择器完成选择时的可定制活动指示器。
  • 修复了 iOS 6 上 TSAssetsViewControllerUICollectionView 不正确的高度。
  • 资产单元格的 thumbnailImageViewmovieMarkImageView 现在可以正确更新布局。
  • 提高了滚动和加载 1000+ 资产时的性能。
1.1 (27.02.2014)
  • 添加了 TSFilter 在向用户显示之前过滤资产。
  • TSAssetsPickerController 的属性已移至数据源。
  • 修复了反转相册列表。
1.0.2 (23.02.2014)
  • 添加了 TSAssetsPickerController 的 Podspec。现在可在 CocoaPods 中找到。
1.0.1 (23.02.2014)
  • 添加了旋转支持
1.0 (22.02.2014)
  • 实现基本功能
  • 添加到 github

许可证

TSAssetsPickerController 可在 Apache 2.0 许可证下使用。

版权所有 © 2014 Tomasz Szulc

根据 Apache 许可证 2.0 版(“许可证”);除非法律要求或书面同意,否则不得使用此文件,除非遵守许可证。可以在以下地址获得许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件是根据“现状”的基础分发的,不提供任何明示或暗示的保证或条件。有关许可证的具体语言管辖权限和限制,请参阅许可证。