carrierwave-ios 是一款易于使用的 iOS 库,它提供了灵活的方式下载、上传和编辑资产文件。设计用于与 CarrierWave Ruby gem 集成,可以让你工作得更快。
carrierwave-ios 处理
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
对象。它支持gif
、jpeg
、tiff
和png
文件格式。创建后,通过image
属性可以访问UI表示形式。您可以使用某些用法创建图像的压缩副本:
- (instancetype)compressedImageAssetWithQuality:(CGFloat)quality;
CRVVideoAsset
提供了方便的创建资源对象的接口,可以来自NSData
实例或本地视频文件。它支持mov
和mp4
文件格式。此外,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;
此外,“carrierwave-ios”还提供了用于编辑所选照片的手动UI组件。CRVImageEditViewController
负责缩放、旋转和裁剪照片。以下是它在演示应用中的预览:
使用非常简单,只需创建新实例并显示它
CRVImageEditViewController *controller = [[CRVImageEditViewController alloc] initWithImageAsset:imageAsset];
controller.delegate = self;
[self presentViewController:controller animated:YES completion:nil];
如果您使用的是故事板,您也可以在InterfaceBuilder中将新视图控制器拖入,并将它的类设置为CRVImageEditViewController
。
我们尽了最大努力让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
裁剪边界也可以自定义。它有一系列选项,有助于其适应您的应用程序风格。更多详细信息,请参阅CRVScalableView和CRVScalableBorder
@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;
动画算法足够聪明,可以验证指定的/计算出的帧是否位于父视图中。如果不是,则将原点和/或大小更改为有效值。所以您不必担心裁剪视图会移出父视图的界限。
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-ios受MIT 许可协议保护。
首先,感谢您的贡献!
以下是您需要遵循的一些指导方针
有任何疑问?请提交问题!
Adrian Kashivskyy
Patryk Kaczmarek
Wojciech Trzasko
Grzegorz Lesiak
Paweł Białecki
版权© 2014-2015 Netguru