Carrierwave 0.1.0

Carrierwave 0.1.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年3月

Patryk Kaczmarek 维护。



  • 编辑者:
  • Adrian Kashivskyy, Patryk Kaczmarek 和 Wojciech Trzasko

carrierwave-ios

Circle CI

carrierwave-ios 是一款易于使用的 iOS 库,它提供了灵活的方式下载、上传和编辑资产文件。设计用于与 CarrierWave Ruby gem 集成,可以让你工作得更快。

特性

carrierwave-ios 处理

  • 下载和上传资产
  • 编辑图像资产
  • 图像压缩

要求

  • Xcode 6.0 和 iOS 8.0 SDK
  • Carthage 0.5
  • CocoaPods 0.36.0.rc.1(使用 sudo gem install cocoapods --pre 安装它!)

配置

只需在源文件中添加 @import Carrierwave,您想要使用 carrierwave-ios

要连接 carrierwave-ios 与 Rails 后端,只需将 serverURL 属性设置在 [CRVNetworkManager sharedManager] 中的后端服务器 URL。我们推荐在 AppDelegate 类的 application:didFinishLaunchingWithOptions: 方法中这样做。

使用方法

CRVNetworkManager 封装了常见任务,包括上传、下载和删除资产。所有支持资产都应该使用 CRVAssetType 协议进行封装。

上传任务

声明

- (NSString *)uploadAsset:(id<CRVAssetType>)asset progress:(CRVProgressBlock)progress completion:(CRVUploadCompletionBlock)completion;
- (NSString *)uploadAsset:(id<CRVAssetType>)asset toURL:(NSURL *)url progress:(CRVProgressBlock)progress completion:(CRVUploadCompletionBlock)completion;

创建上传过程

NSString *proccessId;
proccessId = [[CRVNetworkManager sharedManager] uploadAsset:asset progress:^(double progress) {
    NSLog(@"Progress: %f", progress);
} completion:^(CRVUploadInfo *info, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success: %@", info);
    }                  
}]

如果在成功完成上传,方法将返回封装上传资产的 assetIdentifier 和服务器端路径(存储在 assetPath 属性中)的 CRVUploadInfo 对象。对于动态服务器 URL,请使用 uploadAsset:toURL:progress:completion 方法。

下载任务

声明

- (NSString *)downloadAssetWithIdentifier:(NSString *)identifier progress:(CRVProgressBlock)progress completion:(CRVDownloadCompletionBlock)completion;
- (NSString *)downloadAssetFromURL:(NSURL *)url progress:(CRVProgressBlock)progress completion:(CRVDownloadCompletionBlock)completion;

创建下载过程

NSString *proccessId
proccessId = [[CRVNetworkManager sharedManager] downloadAssetWithIdentifier:identifier progress:^(double progress) {
    NSLog(@"Progress: %f", progress);
} completion:^(CRVImageAsset *asset, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success");
    }
}

对于动态服务器 URL,请使用 uploadAsset:toURL:progress:completion 方法。

删除任务

声明

- (void)deleteAssetWithIdentifier:(NSString *)identifier completion:(CRVCompletionBlock)completion;
- (void)deleteAssetFromURL:(NSURL *)url completion:(CRVCompletionBlock)completion;

调用删除

[[CRVNetworkManager sharedManager] deleteAssetWithIdentifier:identifier completion:^(BOOL success, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success");
    }
}

对于动态服务器 URL,请使用 uploadAsset:toURL:progress:completion 方法。

资产类型

如前所述,所有上传对象都应该遵守 CRVAssetType 协议。carrierwave-ios 携带用于常见图像和视频文件类型的可用的类。

CRVImageAsset提供了从NSURL创建图片资源的基本接口,可以是本地图片文件、NSData实例或UIImage对象。它支持gifjpegtiffpng文件格式。创建后,通过image属性可以访问UI表示形式。您可以使用某些用法创建图像的压缩副本:

- (instancetype)compressedImageAssetWithQuality:(CGFloat)quality;

CRVVideoAsset提供了方便的创建资源对象的接口,可以来自NSData实例或本地视频文件。它支持movmp4文件格式。此外,CRVVideoAsset可以使用方法将选定的视频加载到AVPlayerItem

- (void)loadVideoWithCompletion:(CRVVideoLoadCompletionBlock)completion; 

使用示例

[asset loadVideoWithCompletion:^(AVPlayerItem *videoItem, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Video loaded");
    }
}];

过程管理

CRVNetworkManager提供了处理上传或下载过程生命周期的额外方法,这些方法非常直接且易于理解。所有函数的参数都是通过创建方法返回的标识符。

- (void)cancelProccessWithIdentifier:(NSString *)identifier;
- (void)pauseProccessWithIdentifier:(NSString *)identifier;
- (void)resumeProccessWithIdentifier:(NSString *)identifier;

UI组件

此外,“carrierwave-ios”还提供了用于编辑所选照片的手动UI组件。CRVImageEditViewController负责缩放、旋转和裁剪照片。以下是它在演示应用中的预览:

crop view example

使用方法

使用非常简单,只需创建新实例并显示它

CRVImageEditViewController *controller =  [[CRVImageEditViewController alloc] initWithImageAsset:imageAsset];
controller.delegate = self;
[self presentViewController:controller animated:YES completion:nil];

如果您使用的是故事板,您也可以在InterfaceBuilder中将新视图控制器拖入,并将它的类设置为CRVImageEditViewController

UI可配置性

我们尽了最大努力让CRVImageEditViewController尽可能可配置,因此其接口公开了大量有用的属性以适应任何应用程序。

代理

设置CRVImageEditViewControllerDelegate提供将自定义UI组件注入中的可能性

  • 标题视图 - 放置在屏幕顶部。
  • 页脚视图 - 放置在屏幕底部。

其余空间用于缩放、旋转和裁剪图像。

可以通过实现方法引入自己的UI组件

- (UIView *)viewForHeaderInImageEditViewController:(CRVImageEditViewController *)controller;
- (UIView *)viewForFooterInImageEditViewController:(CRVImageEditViewController *)controller;

要创建一个具有通信功能视图,你必须使CRVHeaderFooterView类派生,并使用eventMessenger来发布消息

- (void)postCancelMessage;
- (void)postDoneMessage;
- (void)postShowRatioSheetMessage;
- (void)postResetTransformationMessage;

这里是一个示例。

指定标题和页脚高度也是可能的

- (CGFloat)heightForHeaderInImageEditViewController:(CRVImageEditViewController *)controller; //default 20 points
- (CGFloat)heightForFooterInImageEditViewController:(CRVImageEditViewController *)controller; //default 60 points

裁剪边界

裁剪边界也可以自定义。它有一系列选项,有助于其适应您的应用程序风格。更多详细信息,请参阅CRVScalableViewCRVScalableBorder

动画选项

@property (assign, nonatomic) NSTimeInterval animationDuration;
@property (assign, nonatomic) UIViewAnimationOptions animationCurve;
@property (assign, nonatomic) CGFloat springDamping;
@property (assign, nonatomic) CGFloat springVelocity;

边界网格

@property (assign, nonatomic) CRVGridDrawingMode gridDrawingMode;
@property (assign, nonatomic) CRVGridStyle gridStyle;
@property (strong, nonatomic) UIColor *gridColor;
@property (assign, nonatomic) NSUInteger gridThickness;
@property (assign, nonatomic) NSInteger numberOfGridlines;

边界

@property (assign, nonatomic) CRVBorderDrawingMode borderDrawinMode;
@property (assign, nonatomic) CRVBorderStyle borderStyle;
@property (strong, nonatomic) UIColor *borderColor;
@property (assign, nonatomic) NSUInteger borderThickness;
@property (assign, nonatomic) NSUInteger borderInset;

锚点

@property (assign, nonatomic) CRVAnchorsDrawingMode anchorsDrawingMode;
@property (strong, nonatomic) UIColor *anchorsColor;
@property (assign, nonatomic) NSUInteger anchorThickness;

自定义绘制

虽然公开的属性可以对裁剪边界进行大量定制,但也提供了一个特殊的方法,在现有上下文中进行自己的绘制

- (void)drawRect:(CGRect)rect withinContext:(CGContextRef)context;

屏幕上变化后的处理

还可以接收用户事件并对它们做出响应。您需要做的只是确认CRVScalableViewDelegate协议并实现感兴趣的函数

- (void)scalableViewDidBeginScaling:(CRVScalableView *)view;
- (void)scalableViewDidEndScaling:(CRVScalableView *)view;
- (void)scalableViewDidBeginMoving:(CRVScalableView *)view;
- (void)scalableViewDidEndMoving:(CRVScalableView *)view;
- (void)scalableViewDidMove:(CRVScalableView *)view;
- (void)scalableViewDidScale:(CRVScalableView *)view;

裁剪边框动画

使裁剪视图动画到指定的帧

- (void)animateToFrame:(CGRect)frame completion:(void (^)(BOOL finished))completion;

使裁剪视图动画到其中心的指定尺寸

- (void)animateToSize:(CGSize)size completion:(void (^)(BOOL finished))completion;

使裁剪视图动画到其中心的指定比例。最终尺寸取决于父视图的范围

- (void)animateToRatio:(CGFloat)ratio completion:(void (^)(BOOL finished))completion;

动画算法足够聪明,可以验证指定的/计算出的帧是否位于父视图中。如果不是,则将原点和/或大小更改为有效值。所以您不必担心裁剪视图会移出父视图的界限。

演示

demo example

carrierwave-ios附带有简单的演示应用程序,实现了库的基本功能,如上传文件和编辑图像资产。要运行演示,请按照以下说明操作

$ git clone --recursive [email protected]:netguru/carrierwave-ios.git
$ carthage update
$ pod install

或者如果您已经使用--recursive克隆了项目

$ git submodule update --init --recursive
$ carthage update
$ pod install

许可协议

carrierwave-iosMIT 许可协议保护。

贡献

首先,感谢您的贡献!

以下是您需要遵循的一些指导方针

更多信息

有任何疑问?请提交问题

作者

Adrian Kashivskyy

Patryk Kaczmarek

Wojciech Trzasko

Grzegorz Lesiak

Paweł Białecki

版权© 2014-2015 Netguru