iOS控件之UIImagePickerController

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

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

官方文檔中對于該類的說明是:

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

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

  • 屬性


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

該對象的代理需要實(shí)現(xiàn)UINavigationControllerDelegate和UIImagePickerControllerDelegate協(xié)議纽什,nullable是xcode6.3之后引入的nullability annotations特性措嵌,主要用于在OC和swift之間的轉(zhuǎn)換。這一特性主要包含兩個(gè)新的類型注釋__nullable和__nonnull芦缰,用于表示對象是否可以是NULL或nil(具體內(nèi)容請參考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)用對應(yīng)的相薄让蕾,包含照片流和其它自定義的相冊浪规,PhotosAlbum則對應(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,表示拍完照片或者從相冊選完照片后粱腻,是否跳轉(zhuǎn)到編輯模式對圖片裁剪庇配,只有在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,//1280720的分辨率
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舟铜,可以是照片庫/相冊/相機(jī).
isCameraDeviceAvailable判斷當(dāng)前設(shè)備是否支持前置攝像頭或者后置攝像頭
isFlashAvailableForCameraDevice是否支持前置攝像頭閃光燈或者后置攝像頭閃光燈
availableMediaTypesForSourceType方法返回所特定的媒體如相冊/圖片庫/相機(jī)所支持的媒體類型數(shù)組,元素值可以是kUTTypeImage類型或者kUTTypeMovie類型的靜態(tài)字符串戈盈,所以是NSString類型的數(shù)組
availableCaptureModesForCameraDevice返回特定的攝像頭(前置攝像頭/后置攝像頭)所支持的拍攝模式數(shù)值數(shù)組,元素值可以是UIImagePickerControllerCameraCaptureMode枚舉里面的video或者photo,所以是NSNumber類型的數(shù)組


  • 對象方法

    - (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è)備不支持視頻拍攝,磁盤空間不足等情況虹曙,該方法會返回NO.該方法結(jié)合自定義overlayView可以拍攝多部視頻
stopVideoCapture當(dāng)你調(diào)用此方法停止視頻拍攝時(shí)迫横,它會調(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í)會調(diào)用DidCancel方法矾踱,默認(rèn)實(shí)現(xiàn)銷毀彈出的視圖。當(dāng)完成內(nèi)容的選取時(shí)會調(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用來保存照片到相冊,seletor應(yīng)該設(shè)置為- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;當(dāng)照片保存到相冊完成時(shí)返奉,會調(diào)用該方法通知你贝搁。
UIVideoAtPathIsCompatibleWithSavedPhotosAlbum會返回布爾類型的值判斷該路徑下的視頻能否保存到相冊,視頻需要先存儲到沙盒文件再保存到相冊衡瓶,而照片是可以直接從代理完成的回調(diào)info字典里面獲取到徘公。
UISaveVideoAtPathToSavedPhotosAlbum用來保存視頻到相冊,seletor應(yīng)該設(shè)置為- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;當(dāng)視頻保存到相冊或出錯(cuò)時(shí)會調(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的詳解請參考iOS系統(tǒng)配置info.plist下面是關(guān)于使用UIImagePickerConreoller來上傳頭像,照片多選以及拍攝視頻的一個(gè)Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末等太,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛮放,更是在濱河造成了極大的恐慌缩抡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件包颁,死亡現(xiàn)場離奇詭異瞻想,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娩嚼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門蘑险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岳悟,你說我怎么就攤上這事佃迄∑貌睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵呵俏,是天一觀的道長堆缘。 經(jīng)常有香客問我,道長普碎,這世上最難降的妖魔是什么吼肥? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮随常,結(jié)果婚禮上潜沦,老公的妹妹穿的比我還像新娘。我一直安慰自己绪氛,他們只是感情好唆鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枣察,像睡著了一般争占。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上序目,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天臂痕,我揣著相機(jī)與錄音,去河邊找鬼猿涨。 笑死握童,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叛赚。 我是一名探鬼主播澡绩,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俺附!你這毒婦竟也來了肥卡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤事镣,失蹤者是張志新(化名)和其女友劉穎步鉴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笼呆。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情障般,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布盛杰,位于F島的核電站挽荡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏即供。R本人自食惡果不足惜定拟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逗嫡。 院中可真熱鬧青自,春花似錦、人聲如沸驱证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抹锄。三九已至逆瑞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伙单,已是汗流浹背获高。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吻育,地道東北人念秧。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像布疼,于是被迫代替她去往敵國和親摊趾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容