UIImagePikerController 淺析

原文連接:http://www.jianshu.com/p/2ac85aca4468swift

 

UIImagePickerController是iOS系統提供的和系統的相冊和相機交互的一個類,能夠用來獲取相冊的照片,也能夠調用系統的相機拍攝照片或者視頻。該類的繼承結構是:數組

UIImagePickerController-->UINavigationController-->UIViewController-->UIResponder-->NSObjectxcode

官方文檔中對於該類的說明是:網絡

該類只支持豎屏模式,爲了保證該類被原樣使用,它不支持子類,而且它的視圖層次是私有的不能被修改,只支持自定義cameraOverlayView屬性來展現更多信息以及和用戶的交互。框架

因爲該類繼承自UINavgationController,因此在使用過程當中通常實現UIImagePickerControllerDelegateUINavigationControllerDelegate這兩個代理,能夠利用navgation的push 和pop操做自定義界面實現更復雜的交互效果。下面具體分析該類的一些方法和屬性.ide

  • 屬性


@property(nullable,nonatomic,weak) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

該對象的代理須要實現UINavigationControllerDelegate和UIImagePickerControllerDelegate協議,nullable是xcode6.3以後引入的nullability annotations特性,主要用於在OC和swift之間的轉換。這一特性主要包含兩個新的類型註釋nullable和nonnull,用於表示對象是否能夠是NULL或nil(具體內容請參考Xcode特性之nullability annotayions)函數

@property(nonatomic) UIImagePickerControllerSourceType sourceType; // default value is UIImagePickerControllerSourceTypePhotoLibrary.

sourceType用於指定要訪問的系統的媒體類型。UIImagePickerControllerSourceType支持如下3種枚舉類型,默認值是圖片庫工具

typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) { UIImagePickerControllerSourceTypePhotoLibrary, UIImagePickerControllerSourceTypeCamera, UIImagePickerControllerSourceTypeSavedPhotosAlbum };

PhotoLibrary表明系統照片應用對應的相薄,包含照片流和其它自定義的相冊,PhotosAlbum則對應系統照片應用的照片,包含用設備拍攝的全部照片流。Camera則表明相機的攝像頭。ui

@property(nonatomic,copy) NSArray<NSString *> *mediaTypes;

mediaTypes用於設置相機支持的功能,拍照或者是視頻,返回值類型能夠是kUTTypeMovie,kUTTypeImageatom

@property(nonatomic) BOOL showsCameraControls NS_AVAILABLE_IOS(3_1); @property(nonatomic) BOOL allowsEditing NS_AVAILABLE_IOS(3_1); // replacement for -allowsImageEditing; default value is NO. @property(nonatomic) BOOL allowsImageEditing NS_DEPRECATED_IOS(2_0, 3_1);

showsCameraControls用於指定拍照時下方的工具欄是否顯示,allowImageEditing在iOS3.1就已廢棄,取而代之的是allowEditing,表示拍完照片或者從相冊選完照片後,是否跳轉到編輯模式對圖片裁剪,只有在showsCameraControls爲YES時纔有效果。

@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraCaptureModePhoto @property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraDeviceRear @property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode @property(nullable, nonatomic,strong) __kindof UIView *cameraOverlayView NS_AVAILABLE_IOS(3_1); // set a view to overlay the preview view. @property(nonatomic) CGAffineTransform cameraViewTransform NS_AVAILABLE_IOS(3_1); // set the transform of the preview view.

當sourceType是camera的時候,這幾個屬性有限,不然拋出異常。cameraCaptureMode捕捉模式指定的是相機是拍攝照片仍是視頻,它的枚舉類型以下:

NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) { UIImagePickerControllerCameraCaptureModePhoto,//photo UIImagePickerControllerCameraCaptureModeVideo//video };

cameraDevice指定拍攝的攝像頭位置,是使用前置攝像頭仍是後置攝像頭,它的枚舉類型有:

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) { UIImagePickerControllerCameraDeviceRear, UIImagePickerControllerCameraDeviceFront };

cameraFlashMode用於指定閃光燈模式,它的枚舉類型以下:

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) { UIImagePickerControllerCameraFlashModeOff = -1, UIImagePickerControllerCameraFlashModeAuto = 0, UIImagePickerControllerCameraFlashModeOn = 1 };

cameraViewTransform該結構體能夠用於指定拍攝時View的一些形變屬性,如旋轉縮放等。
當showsCameraControls爲NO,系統的工具欄隱藏時,咱們能夠自定義背景View賦值給cameraOverlayView添加到拍攝時的預覽視圖之上。

@property(nonatomic) NSTimeInterval videoMaximumDuration NS_AVAILABLE_IOS(3_1); // default value is 10 minutes. @property(nonatomic) UIImagePickerControllerQualityType videoQuality NS_AVAILABLE_IOS(3_1);

videoMaximumDuration用於設置視頻拍攝模式下最大拍攝時長,默認值是10分鐘。 videoQuality表示拍攝的視頻質量設置,默認是Medium即表示中等質量。 videoQuality支持的枚舉類型以下:

typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) { UIImagePickerControllerQualityTypeHigh = 0, // 高清模式 UIImagePickerControllerQualityTypeMedium = 1, //中等質量,適於WIFI傳播 UIImagePickerControllerQualityTypeLow = 2, //低等質量,適於蜂窩網絡傳輸 UIImagePickerControllerQualityType640x480 NS_ENUM_AVAILABLE_IOS(4_0) = 3, // VGA 質量 UIImagePickerControllerQualityTypeIFrame1280x720 NS_ENUM_AVAILABLE_IOS(5_0) = 4,//1280*720的分辨率 UIImagePickerControllerQualityTypeIFrame960x540 NS_ENUM_AVAILABLE_IOS(5_0) = 5,//960*540分辨率 };
  • 類方法


@interface UIImagePickerController : UINavigationController <NSCoding> + (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType; // returns YES if source is available (i.e. camera present) + (nullable NSArray<NSString *> *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType; // returns array of available media types (i.e. kUTTypeImage) + (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0); // returns YES if camera device is available + (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0); // returns YES if camera device supports flash and torch. + (nullable NSArray<NSNumber *> *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0);

isSourceTypeAvailable用於判斷當前設備是否支持指定的sourceType,能夠是照片庫/相冊/相機.
isCameraDeviceAvailable判斷當前設備是否支持前置攝像頭或者後置攝像頭
isFlashAvailableForCameraDevice是否支持前置攝像頭閃光燈或者後置攝像頭閃光燈
availableMediaTypesForSourceType方法返回所特定的媒體如相冊/圖片庫/相機所支持的媒體類型數組,元素值能夠是kUTTypeImage類型或者kUTTypeMovie類型的靜態字符串,因此是NSString類型的數組
availableCaptureModesForCameraDevice返回特定的攝像頭(前置攝像頭/後置攝像頭)所支持的拍攝模式數值數組,元素值能夠是UIImagePickerControllerCameraCaptureMode枚舉裏面的video或者photo,因此是NSNumber類型的數組


  • 對象方法

    - (void)takePicture NS_AVAILABLE_IOS(3_1); - (BOOL)startVideoCapture NS_AVAILABLE_IOS(4_0); - (void)stopVideoCapture NS_AVAILABLE_IOS(4_0);

takePicture能夠用來實現照片的連續拍攝,須要本身自定義拍攝的背景視圖來賦值給cameraOverlayView ,結合自定義overlayView實現多張照片的採集,在收到代理的didFinishPickingMediaWithInfo方法以後能夠啓動額外的捕捉。
startVideoCapture用來判斷當前是否能夠開始錄製視頻,當視頻正在拍攝中,設備不支持視頻拍攝,磁盤空間不足等狀況,該方法會返回NO.該方法結合自定義overlayView能夠拍攝多部視頻
stopVideoCapture當你調用此方法中止視頻拍攝時,它會調用代理的imagePickerController:didFinishPickingMediaWithInfo:方法


  • 代理方法

    @protocol UIImagePickerControllerDelegate<NSObject> @optional - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0); - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info; - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker; @end
    imagePickerController:didFinishPickingImage:editingInfo:在iOS3.0中已廢棄,再也不使用。當用戶取消選取的內容時會調用DidCancel方法,默認實現銷燬彈出的視圖。當完成內容的選取時會調用didFinishPickingMediaWithInfo方法,默認info字典的key值能夠是如下類型:
    UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType; //指定用戶選擇的媒體類型 UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage; // 原始圖片 UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage; // 修改後的圖片 UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect; // 裁剪尺寸 UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL; // 媒體的URL UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL NS_AVAILABLE_IOS(4_1); // 原件的URL UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata //當數據來源是相機的時候獲取到的靜態圖像元數據,可使用phtoho框架進行處理

  • C函數(保存照片或視頻)

    UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo); UIKIT_EXTERN BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) NS_AVAILABLE_IOS(3_1); UIKIT_EXTERN void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo) NS_AVAILABLE_IOS(3_1);
    UIImageWriteToSavedPhotosAlbum用來保存照片到相冊,seletor應該設置爲- (void)image:(UIImage )image didFinishSavingWithError:(NSError )error contextInfo:(void )contextInfo;當照片保存到相冊完成時,會調用該方法通知你。
    UIVideoAtPathIsCompatibleWithSavedPhotosAlbum會返回布爾類型的值判斷該路徑下的視頻可否保存到相冊,視頻須要先存儲到沙盒文件再保存到相冊,而照片是能夠直接從代理完成的回調info字典裏面獲取到。
    UISaveVideoAtPathToSavedPhotosAlbum用來保存視頻到相冊,seletor應該設置爲- (void)video:(NSString
    )videoPath didFinishSavingWithError:(NSError )error contextInfo:(void )contextInfo;當視頻保存到相冊或出錯時會調用該方法通知你。
    這三個方法通常是在代理的完成方法didFinishPickingMediaWithInfo裏面配合使用。

關於編輯照片界面的英文,能夠在info.plist設置Localized resources can be mixed 的值爲YES就能夠轉換爲你當前系統的語言。更多關於info.plist的詳解請參考iOS系統配置info.plist下面是關於使用UIImagePickerConreoller來上傳頭像,照片多選以及拍攝視頻的一個Demo

相關文章
相關標籤/搜索