當前位置:編程學習大全網 - 源碼下載 - 如何優雅地使用iOS系統相機,相冊

如何優雅地使用iOS系統相機,相冊

如何優雅地使用iOS系統相機、相冊

概述

iOS系統相機、相冊功能全部依托於圖像選取控制器UIImagePickerController,在使用該控制器時,我們需要按照如下步驟進行

檢查指定的資源類型是否可用

檢查指定資源類型下是否支持指定的媒體類型

檢查用戶對相機、相冊的授權狀態

初始化並彈出圖像選取控制器

處理操作完成後的代理回調

檢查指定的資源類型是否可用

這步操作用於檢查設備是否支持指定的資源類型,以防盲目調用圖像選取器導致程序不可用,比如采用模擬器調用相機

圖像選取控制器的資源類型是壹個枚舉,擁有如下三種類型

UIImagePickerControllerSourceTypeCamera // 相機類型

UIImagePickerControllerSourceTypePhotoLibrary // 照片庫類型,相當於系統應用"照片"中的"相簿/Photos"欄加上"照片/Moments"欄

UIImagePickerControllerSourceTypeSavedPhotosAlbum // 照片類型,相當於系統應用"照片"中的"照片/Moments"欄123123

我們可以使用isSourceTypeAvailable方法進行檢查

// 以"檢查圖像選擇器的相機類型是否可用"為例

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

{

// 相機類型可用

}

else

{

// 相機類型不可用

}1234567891012345678910

檢查指定資源類型下是否支持指定的媒體類型

這步操作用於檢查某種資源類型下是否支持某種媒體類型,比如iPhone是否可以拍LivePhoto

圖像選取控制器的媒體類型主要分為兩大類,圖片類型與視頻類型

kUTTypeImage(圖片類型,細分為kUTTypeJPEG、kUTTypeGIF、kUTTypeLivePhoto等)

kUTTypeMovie(視頻類型,細分為kUTTypeMovie、kUTTypeMP3、kUTTypeAVIMovie等)1212

註1: 媒體類型以常量形式定義,需要引入MobileCoreServices.framework

註2: 媒體類型常量是CFString類型,在使用時需要強轉為NSString類型

我們可以使用availableMediaTypesForSourceType:方法返回指定資源類型下支持的媒體類型數組

// 以"檢查圖像選擇器在相機類型下是否支持圖片類型"為例

// 返回相機類型下支持的媒體類型數組

NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

// 判斷數組中是否擁有(NSString *)kUTTypeImage元素

if ([availableMediaTypes containsObject:(NSString *)kUTTypeImage])

{

// 圖片類型可用

}

else

{

// 圖片類型不可用

}1234567891011121312345678910111213

檢查用戶對相機、相冊的授權狀態

這步操作根據用戶授權狀態決定是否彈出圖像選取控制器,比如用戶授權狀態為拒絕狀態,那麽便需要提示用戶,而不是彈出壹個黑屏的控制器

檢查用戶對相機的授權狀態

註: 需要引入AVFoundation.framework

相機媒體類型主要有兩種常用類型

AVMediaTypeVideo(視頻媒體類型)

AVMediaTypeAudio(音頻媒體類型)1212

用戶對相機的授權狀態是壹個枚舉,擁有如下四種類型

AVAuthorizationStatusNotDetermined // 用戶沒有選擇是否授權使用

AVAuthorizationStatusRestricted // 用戶禁止使用,且授權狀態不可修改,可能由於家長控制功能

AVAuthorizationStatusDenied // 用戶已經禁止使用

AVAuthorizationStatusAuthorized // 用戶已經授權使用12341234

我們可以使用authorizationStatusForMediaType:方法返回用戶對指定的相機媒體類型的授權狀態

// 以"檢查用戶對視頻媒體類型的授權狀態"為例

// 返回用戶對視頻媒體類型的授權狀態

AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

// 處理不同授權狀態下的操作流程

switch (authorizationStatus)

{

case AVAuthorizationStatusNotDetermined:

{

// 用戶沒有選擇是否授權使用

}

break;

case AVAuthorizationStatusRestricted:

{

// 用戶禁止使用,且授權狀態不可修改,可能由於家長控制功能

}

break;

case AVAuthorizationStatusDenied:

{

// 用戶已經禁止使用

}

break;

case AVAuthorizationStatusAuthorized:

{

// 用戶已經授權使用

}

break;

}1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728

在相機授權狀態為AVAuthorizationStatusNotDetermined時,我們有必要先利用requestAccessForMediaType:completionHandler:方法來彈窗要求用戶選擇是否授權,而非直接彈出圖像選取控制器,由系統自動彈窗詢問用戶是否授權

// 以"彈窗要求用戶選擇是否授權"為例

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {

if(granted)

{

// 用戶授權使用

}

else

{

// 用戶禁止使用

}

}];123456789101112123456789101112

註1: 該彈窗只在授權狀態為AVAuthorizationStatusNotDetermined時才會顯示

註2: 在使用AVCaptureDeviceInput且授權狀態為AVAuthorizationStatusNotDetermined時,該彈窗會自動顯示

檢查用戶對相冊的授權狀態

註: 需要引入AssetsLibrary.framework

用戶對相冊的授權狀態是壹個枚舉,擁有如下四種類型

ALAuthorizationStatusNotDetermined // 用戶沒有選擇是否授權使用

ALAuthorizationStatusRestricted // 用戶禁止使用,且授權狀態不可修改,可能由於家長控制功能

ALAuthorizationStatusDenied // 用戶已經禁止使用

ALAuthorizationStatusAuthorized // 用戶已經授權使用12341234

我們可以使用authorizationStatus方法返回用戶對相冊的授權狀態

// 以"檢查用戶對相冊的授權狀態"為例

// 返回用戶對相冊的授權狀態

ALAuthorizationStatus authorizationStatus = [ALAssetsLibrary authorizationStatus];

// 處理不同授權狀態下的操作流程

switch (authorizationStatus)

{

case ALAuthorizationStatusNotDetermined:

{

// 用戶沒有選擇是否授權使用

}

break;

case ALAuthorizationStatusRestricted:

{

// 用戶禁止使用,且授權狀態不可修改,可能由於家長控制功能

}

break;

case ALAuthorizationStatusDenied:

{

// 用戶已經禁止使用

}

break;

case ALAuthorizationStatusAuthorized:

{

// 用戶已經授權使用

}

break;

}1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728

初始化並彈出圖像選取控制器

初始化相機控制器

// 創建圖像選取控制器對象

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

// 將資源類型設置為相機類型

picker.sourceType = UIImagePickerControllerSourceTypeCamera;

// 將媒體類型設置為圖片類型和視頻類型(數組中如果只寫壹個,圖像選擇控制器即只允許拍照/錄像)

picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];

// 設置拍照後的圖片允許編輯

picker.allowsEditing = YES;

// 設置攝像圖像品質,默認是UIImagePickerControllerQualityTypeMedium

picker.videoQuality = UIImagePickerControllerQualityTypeHigh;

// 設置最長攝像時間,默認是10秒

picker.videoMaximumDuration = 30;

// 設置代理,需要遵守<UINavigationControllerDelegate, UIImagePickerControllerDelegate>兩個協議

picker.delegate = self;

// 彈出圖像選取控制器

[self presentViewController:picker animated:YES completion:nil];1234567891011121314151612345678910111213141516

初始化相冊控制器

// 創建圖像選取控制器對象

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

// 將資源類型設置為相冊類型

picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

// 將媒體類型設置為圖片類型和視頻類型(數組中如果只寫壹個,圖像選擇控制器即只能選取圖片/視頻)

picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];

// 設置選取後的圖片允許編輯

picker.allowsEditing = YES;

// 設置代理,需要遵守<UINavigationControllerDelegate, UIImagePickerControllerDelegate>兩個協議

picker.delegate = self;

// 彈出圖像選取控制器

[self presentViewController:picker animated:YES completion:nil];123456789101112123456789101112

處理操作完成後的代理回調

在對相機、相冊操作完成後,系統會回調如下兩個代理方法

// 操作完成

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info

{

// do something ...

// 回收圖像選取控制器

[picker dismissViewControllerAnimated:YES completion:nil];

}

// 操作取消

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

{

// 回收圖像選取控制器

[picker dismissViewControllerAnimated:YES completion:nil];

}123456789101112131415123456789101112131415

在操作完成回調info字典中,擁有如下可用信息

UIImagePickerControllerMediaType // 媒體類型(kUTTypeImage、kUTTypeMovie等)

UIImagePickerControllerOriginalImage // 原始圖片

UIImagePickerControllerEditedImage // 編輯後圖片

UIImagePickerControllerCropRect // 裁剪尺寸

UIImagePickerControllerMediaMetadata // 拍照的元數據

UIImagePickerControllerMediaURL // 媒體的URL

UIImagePickerControllerReferenceURL // 引用相冊的URL

UIImagePickerControllerLivePhoto // PHLivePhoto1234567812345678

小提示

Q: 在使用系統相機、相冊時,發現系統語言都是英文,比如”取消”顯示為”Cancel”,如何才能調整為中文

A: 這裏有兩種處理方式

方法壹(不推薦): 在info.plist文件中有壹個Localization native development region,默認為en,修改為China即可,這樣默認語言即為中文

方法二(推薦): 在info.plist文件中有壹個Localized resources ca?be mixed,默認為NO,修改為YES即可,這樣會隨著系統語言變化

  • 上一篇:運行Think In Java中的 RMI 示例可能產生的幾種異常及解決
  • 下一篇:哪裏可以看中國福利彩票的直播?
  • copyright 2024編程學習大全網