CRMediaPickerController 0.0.1

CRMediaPickerController 0.0.1

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

Christian Roman 维护。



一个易于使用的 UIImagePickerController 替代品,用于选择图片和视频。


概述

轻松选择、拍摄或使用最后拍摄的照片或视频!

特点

  • 允许用户选择/捕获两种类型的媒体(照片和视频)。
  • 选择选项:相机、相机胶卷、照片库和最后拍摄的照片/视频。
  • 可用的代理协议用于更多控制。
  • 可完全自定义 UIImagePickerController 属性(相机叠加层、相机设备、相机视图变换、允许编辑等)。
  • 使用 Assets Library Framework,提供原始 ALAsset。(易于处理)。
  • 支持纵向和横向模式。
  • 原生的 iOS UI(它在内部使用 UIImagePickerController)。
  • 容易应用于您的项目中。

安装

有三种选择

CocoaPods

  • 将依赖项添加到您的 Podfile
platform :ios
pod 'CRMediaPickerController'
...
  • 运行 pod install 以安装依赖项。

源文件

  • 只需克隆此存储库或将其下载为 zip 文件。
  • 然后您将在 CRMediaPickerController 目录下找到源文件。
  • 将它们复制到您的项目中。

用法

CRMediaPickerController 的创建和显示方式与 UIImagePickerController 非常相似。要使用 CRMediaPickerController,您需要创建一个实例、配置它、显示它并实现代理方法。

CRMediaPickerController 实例创建和显示的示例

self.mediaPickerController = [[CRMediaPickerController alloc] init];
self.mediaPickerController.delegate = self;
self.mediaPickerController.mediaType = CRMediaPickerControllerMediaTypeImage;
self.mediaPickerController.sourceType = CRMediaPickerControllerSourceTypePhotoLibrary;
[self.mediaPickerController show];

属性

  • 媒体类型

mediaType

选择或创建过程中的媒体类型。支持照片、视频或两者。

self.mediaPickerController.mediaType = (CRMediaPickerControllerMediaTypeImage | CRMediaPickerControllerMediaTypeVideo);

可用选项

typedef NS_OPTIONS(NSInteger, CRMediaPickerControllerMediaType) {
    CRMediaPickerControllerMediaTypeImage = 1 << 0,
    CRMediaPickerControllerMediaTypeVideo = 1 << 1
};
  • 源类型

sourceType

选择或创建媒体文件的源。支持多个源。

self.mediaPickerController.sourceType = (CRMediaPickerControllerSourceTypePhotoLibrary | CRMediaPickerControllerSourceTypeCamera | CRMediaPickerControllerSourceTypeLastPhotoTaken);

可用选项

typedef NS_OPTIONS(NSInteger, CRMediaPickerControllerSourceType) {
    CRMediaPickerControllerSourceTypePhotoLibrary       = 1 << 0,
    CRMediaPickerControllerSourceTypeCamera             = 1 << 1,
    CRMediaPickerControllerSourceTypeSavedPhotosAlbum   = 1 << 2,
    CRMediaPickerControllerSourceTypeLastPhotoTaken     = 1 << 3
};

如果 sourceType 属性有多个源,它将显示一个 UIActionSheet,其中包含多个(和可用)选项以供选择。否则,将显示单个 sourceType 类型。

其他属性

@property (nonatomic, assign) NSTimeInterval videoMaximumDuration;
@property (nonatomic, assign) UIImagePickerControllerQualityType videoQualityType;
@property (nonatomic) BOOL allowsEditing;
@property (nonatomic, assign) UIImagePickerControllerCameraCaptureMode cameraCaptureMode;
@property (nonatomic, assign) UIImagePickerControllerCameraDevice cameraDevice;
@property (nonatomic, assign) UIImagePickerControllerCameraFlashMode cameraFlashMode;
@property (nonatomic, retain) UIView *cameraOverlayView;
@property (nonatomic, assign) CGAffineTransform cameraViewTransform;
@property (nonatomic, assign) BOOL showsCameraControls;

实例方法

- (void)show;
- (void)dismiss;
- (BOOL)startVideoCapture;
- (void)stopVideoCapture;
- (void)takePicture;

代理方法

一个 CRMediaPickerController 实例会将选定的媒体文件返回给 CRMediaPickerControllerDelegate。该代理包含类似于 UIImagePickerControllerDelegate 的方法。控制器不是返回表示单个图像的字典,而是发送回原始的 ALAsset 对象,这些对象很容易处理。

  • 完成物品选择

- CRMediaPickerController:didFinishPickingAsset:error

通知代理选择过程已完成,媒体文件可 ready to use。

- (void)CRMediaPickerController:(CRMediaPickerController *)mediaPickerController didFinishPickingAsset:(ALAsset *)asset error:(NSError *)error;

参数

mediaPickerController 提供此信息的 CRMediaPickerController 对象。
asset 以 ALAsset 对象形式选择的媒体文件。
error 描述为什么选择进程失败的错误对象。
  • 已取消

- CRMediaPickerControllerDidCancel

通知代理用户已取消选择过程。

- (void)CRMediaPickerControllerDidCancel:(CRMediaPickerController *)mediaPickerController;

参数

mediaPickerController 提供此信息的 CRMediaPickerController 对象。

CPDMediaPickerControllerDelegate 示例

#pragma mark - CPDMediaPickerControllerDelegate

- (void)CRMediaPickerController:(CRMediaPickerController *)mediaPickerController didFinishPickingAsset:(ALAsset *)asset error:(NSError *)error
{
    if (!error) {

        if (asset) {

            if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {

                ALAssetRepresentation *representation = asset.defaultRepresentation;
                UIImage *image = [UIImage imageWithCGImage:representation.fullScreenImage];
                self.imageView.image = image;

            } else if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) {

                self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:asset.defaultRepresentation.url];
                self.moviePlayer.movieSourceType = MPMediaTypeMovie;
                self.moviePlayer.controlStyle = MPMovieControlStyleDefault;
                self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
                self.moviePlayer.repeatMode = MPMovieRepeatModeNone;
                self.moviePlayer.allowsAirPlay = NO;
                self.moviePlayer.shouldAutoplay = NO;

                self.moviePlayer.view.frame = self.videoView.bounds;
                self.moviePlayer.view.autoresizingMask = (UIViewAutoresizing)(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
                [self.videoView addSubview:self.moviePlayer.view];

                [self.moviePlayer prepareToPlay];

            }

        } else {
            NSLog(@"No media selected");
        }

    } else {
        NSLog(@"%@", error.localizedDescription);
    }
}

- (void)CRMediaPickerControllerDidCancel:(CRMediaPickerController *)mediaPickerController
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

注意:使用 AssetsLibrary.framework 会提示用户授予对他们的照片的访问权限。

示例

仅照片

self.mediaPickerController = [[CRMediaPickerController alloc] init];
self.mediaPickerController.delegate = self;
self.mediaPickerController.mediaType = CRMediaPickerControllerMediaTypeImage;
self.mediaPickerController.sourceType = CRMediaPickerControllerSourceTypePhotoLibrary | CRMediaPickerControllerSourceTypeCamera;
[self.mediaPickerController show];

仅视频

self.mediaPickerController = [[CRMediaPickerController alloc] init];
self.mediaPickerController.delegate = self;
self.mediaPickerController.mediaType = CRMediaPickerControllerMediaTypeVideo;
self.mediaPickerController.sourceType = CRMediaPickerControllerSourceTypeCamera;
self.mediaPickerController.allowsEditing = NO;
self.mediaPickerController.videoQualityType = UIImagePickerControllerQualityTypeMedium;
self.mediaPickerController.videoMaximumDuration = 60.0f;
[self.mediaPickerController show];

照片或视频

self.mediaPickerController = [[CRMediaPickerController alloc] init];
self.mediaPickerController.delegate = self;
self.mediaPickerController.mediaType = CRMediaPickerControllerMediaTypeImage | CRMediaPickerControllerMediaTypeVideo;
self.mediaPickerController.sourceType = CRMediaPickerControllerSourceTypeSavedPhotosAlbum;
[self.mediaPickerController show];

相机叠加

self.mediaPickerController = [[CRMediaPickerController alloc] init];
self.mediaPickerController.delegate = self;
self.mediaPickerController.mediaType = CRMediaPickerControllerMediaTypeImage;
self.mediaPickerController.sourceType = CRMediaPickerControllerSourceTypeCamera;
self.mediaPickerController.allowsEditing = NO;

self.mediaPickerController.showsCameraControls = NO;
[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
self.mediaPickerController.cameraOverlayView = self.overlayView;
self.overlayView = nil;

[self.mediaPickerController show];

具有特定属性的视频

self.mediaPickerController = [[CRMediaPickerController alloc] init];
self.mediaPickerController.delegate = self;
self.mediaPickerController.mediaType = CRMediaPickerControllerMediaTypeVideo;
self.mediaPickerController.sourceType = CRMediaPickerControllerSourceTypePhotoLibrary | CRMediaPickerControllerSourceTypeCamera;
self.mediaPickerController.allowsEditing = NO;
self.mediaPickerController.videoQualityType = UIImagePickerControllerQualityTypeMedium;
self.mediaPickerController.videoMaximumDuration = 60.0f;
[self.mediaPickerController show];

Demo

请参阅 示例 Xcode 项目以了解使用示例。

要求

  • iOS 7.0 或更高版本,ARC 是必需的。
  • AssetsLibrary.Framework
  • AVFoundation.Framework

待办事项

  • 改进 API
  • 支持 iPad
  • 多选?
  • 图像裁剪?

贡献

欢迎任何想为该项目做出贡献的人。

  • 叉此仓库
  • 进行您的更改
  • 提交一个拉取请求

许可证

CRMediaPickerController 根据 MIT 许可证发布。请参阅 LICENSE

联系方式

Christian Roman

http://chroman.me

[email protected]

@chroman