日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

UIImagePikerController 浅析

發(fā)布時(shí)間:2025/7/14 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIImagePikerController 浅析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接:http://www.jianshu.com/p/2ac85aca4468

?

UIImagePickerController是iOS系統(tǒng)提供的和系統(tǒng)的相冊(cè)和相機(jī)交互的一個(gè)類,可以用來獲取相冊(cè)的照片,也可以調(diào)用系統(tǒng)的相機(jī)拍攝照片或者視頻。該類的繼承結(jié)構(gòu)是:

UIImagePickerController-->UINavigationController-->UIViewController-->UIResponder-->NSObject

官方文檔中對(duì)于該類的說明是:

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

由于該類繼承自UINavgationController,所以在使用過程中一般實(shí)現(xiàn)UIImagePickerControllerDelegate和UINavigationControllerDelegate這兩個(gè)代理,可以利用navgation的push 和pop操作自定義界面實(shí)現(xiàn)更復(fù)雜的交互效果。下面具體分析該類的一些方法和屬性.

  • 屬性


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

該對(duì)象的代理需要實(shí)現(xiàn)UINavigationControllerDelegate和UIImagePickerControllerDelegate協(xié)議,nullable是xcode6.3之后引入的nullability annotations特性,主要用于在OC和swift之間的轉(zhuǎn)換。這一特性主要包含兩個(gè)新的類型注釋nullable和nonnull,用于表示對(duì)象是否可以是NULL或nil(具體內(nèi)容請(qǐng)參考Xcode特性之nullability annotayions)

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

sourceType用于指定要訪問的系統(tǒng)的媒體類型。UIImagePickerControllerSourceType支持以下3種枚舉類型,默認(rèn)值是圖片庫

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

PhotoLibrary代表系統(tǒng)照片應(yīng)用對(duì)應(yīng)的相薄,包含照片流和其它自定義的相冊(cè),PhotosAlbum則對(duì)應(yīng)系統(tǒng)照片應(yīng)用的照片,包含用設(shè)備拍攝的所有照片流。Camera則代表相機(jī)的攝像頭。

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

mediaTypes用于設(shè)置相機(jī)支持的功能,拍照或者是視頻,返回值類型可以是kUTTypeMovie,kUTTypeImage

@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用于指定拍照時(shí)下方的工具欄是否顯示,allowImageEditing在iOS3.1就已廢棄,取而代之的是allowEditing,表示拍完照片或者從相冊(cè)選完照片后,是否跳轉(zhuǎn)到編輯模式對(duì)圖片裁剪,只有在showsCameraControls為YES時(shí)才有效果。

@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.

當(dāng)sourceType是camera的時(shí)候,這幾個(gè)屬性有限,否則拋出異常。cameraCaptureMode捕捉模式指定的是相機(jī)是拍攝照片還是視頻,它的枚舉類型如下:

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該結(jié)構(gòu)體可以用于指定拍攝時(shí)View的一些形變屬性,如旋轉(zhuǎn)縮放等。
當(dāng)showsCameraControls為NO,系統(tǒng)的工具欄隱藏時(shí),我們可以自定義背景View賦值給cameraOverlayView添加到拍攝時(shí)的預(yù)覽視圖之上。

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

videoMaximumDuration用于設(shè)置視頻拍攝模式下最大拍攝時(shí)長,默認(rèn)值是10分鐘。 videoQuality表示拍攝的視頻質(zhì)量設(shè)置,默認(rèn)是Medium即表示中等質(zhì)量。 videoQuality支持的枚舉類型如下:

typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) { UIImagePickerControllerQualityTypeHigh = 0, // 高清模式 UIImagePickerControllerQualityTypeMedium = 1, //中等質(zhì)量,適于WIFI傳播 UIImagePickerControllerQualityTypeLow = 2, //低等質(zhì)量,適于蜂窩網(wǎng)絡(luò)傳輸 UIImagePickerControllerQualityType640x480 NS_ENUM_AVAILABLE_IOS(4_0) = 3, // VGA 質(zhì)量 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用于判斷當(dāng)前設(shè)備是否支持指定的sourceType,可以是照片庫/相冊(cè)/相機(jī).
isCameraDeviceAvailable判斷當(dāng)前設(shè)備是否支持前置攝像頭或者后置攝像頭
isFlashAvailableForCameraDevice是否支持前置攝像頭閃光燈或者后置攝像頭閃光燈
availableMediaTypesForSourceType方法返回所特定的媒體如相冊(cè)/圖片庫/相機(jī)所支持的媒體類型數(shù)組,元素值可以是kUTTypeImage類型或者kUTTypeMovie類型的靜態(tài)字符串,所以是NSString類型的數(shù)組
availableCaptureModesForCameraDevice返回特定的攝像頭(前置攝像頭/后置攝像頭)所支持的拍攝模式數(shù)值數(shù)組,元素值可以是UIImagePickerControllerCameraCaptureMode枚舉里面的video或者photo,所以是NSNumber類型的數(shù)組


  • 對(duì)象方法

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

takePicture可以用來實(shí)現(xiàn)照片的連續(xù)拍攝,需要自己自定義拍攝的背景視圖來賦值給cameraOverlayView ,結(jié)合自定義overlayView實(shí)現(xiàn)多張照片的采集,在收到代理的didFinishPickingMediaWithInfo方法之后可以啟動(dòng)額外的捕捉。
startVideoCapture用來判斷當(dāng)前是否可以開始錄制視頻,當(dāng)視頻正在拍攝中,設(shè)備不支持視頻拍攝,磁盤空間不足等情況,該方法會(huì)返回NO.該方法結(jié)合自定義overlayView可以拍攝多部視頻
stopVideoCapture當(dāng)你調(diào)用此方法停止視頻拍攝時(shí),它會(huì)調(diào)用代理的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中已廢棄,不再使用。當(dāng)用戶取消選取的內(nèi)容時(shí)會(huì)調(diào)用DidCancel方法,默認(rèn)實(shí)現(xiàn)銷毀彈出的視圖。當(dāng)完成內(nèi)容的選取時(shí)會(huì)調(diào)用didFinishPickingMediaWithInfo方法,默認(rèn)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 //當(dāng)數(shù)據(jù)來源是相機(jī)的時(shí)候獲取到的靜態(tài)圖像元數(shù)據(jù),可以使用phtoho框架進(jìn)行處理

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

    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用來保存照片到相冊(cè),seletor應(yīng)該設(shè)置為- (void)image:(UIImage )image didFinishSavingWithError:(NSError )error contextInfo:(void )contextInfo;當(dāng)照片保存到相冊(cè)完成時(shí),會(huì)調(diào)用該方法通知你。
    UIVideoAtPathIsCompatibleWithSavedPhotosAlbum會(huì)返回布爾類型的值判斷該路徑下的視頻能否保存到相冊(cè),視頻需要先存儲(chǔ)到沙盒文件再保存到相冊(cè),而照片是可以直接從代理完成的回調(diào)info字典里面獲取到。
    UISaveVideoAtPathToSavedPhotosAlbum用來保存視頻到相冊(cè),seletor應(yīng)該設(shè)置為- (void)video:(NSString )videoPath didFinishSavingWithError:(NSError )error contextInfo:(void )contextInfo;當(dāng)視頻保存到相冊(cè)或出錯(cuò)時(shí)會(huì)調(diào)用該方法通知你。
    這三個(gè)方法一般是在代理的完成方法didFinishPickingMediaWithInfo里面配合使用。

關(guān)于編輯照片界面的英文,可以在info.plist設(shè)置Localized resources can be mixed 的值為YES就可以轉(zhuǎn)換為你當(dāng)前系統(tǒng)的語言。更多關(guān)于info.plist的詳解請(qǐng)參考iOS系統(tǒng)配置info.plist下面是關(guān)于使用UIImagePickerConreoller來上傳頭像,照片多選以及拍攝視頻的一個(gè)Demo



總結(jié)

以上是生活随笔為你收集整理的UIImagePikerController 浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。