iOS 從相機/相冊獲取圖片的文章很多,本文也并沒有對系統(tǒng)的相冊/相機界面做多少優(yōu)化.只是從程序健壯性,用戶體驗的角度對我以往的代碼進(jìn)行封裝優(yōu)化
首先,demo地址:https://github.com/sun6762/getPicture.git
準(zhǔn)備工作
a. 要能使真機在使用時成功調(diào)用相冊/拍照功能必須在info.plist,添加
Privacy - Camera Usage Description & Privacy - Photo Library Usage Description,當(dāng)然,在測試的時候根據(jù)提示添加更好
b. 要使用imgPickerController的代理必須有UIImagePickerControllerDelegate, UINavigationControllerDelegate2個代理
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@end
用戶開啟相機權(quán)限
// 引入以下2個類
#import <AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVMediaFormat.h>
AVAuthorizationStatus avStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
// avStatus 的4中類型
/*
AVAuthorizationStatusNotDetermined // 初次調(diào)用
AVAuthorizationStatusRestricted // 禁用
AVAuthorizationStatusDenied //
AVAuthorizationStatusAuthorized // 開通權(quán)限
*/
// 用戶開放相機權(quán)限后 判斷相機是否可用
BOOL useable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
用戶開啟相冊權(quán)限,跟上述過程相似
// 導(dǎo)入此類
#import <Photos/Photos.h>
PHAuthorizationStatus phStatus = [PHPhotoLibrary authorizationStatus];
// 同樣 phStatus 有4中類型
/*
PHAuthorizationStatusNotDetermined = 0
PHAuthorizationStatusRestricted
PHAuthorizationStatusDenied
PHAuthorizationStatusAuthorized
*/
// 判斷相冊權(quán)限
[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]
打開相機/相冊
// 打開相機/相冊
- (void)openSuccWith:(NSString *)flag{
UIImagePickerController *photoPicker = [UIImagePickerController new];
photoPicker.delegate = self;
photoPicker.allowsEditing = NO;
if ([flag isEqualToString:AV]) {
photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
if ([flag isEqualToString:PH]) {
photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
[self presentViewController:photoPicker animated:YES completion:nil];
}
用戶關(guān)閉iOS拍照/相冊權(quán)限,引導(dǎo)用戶打開拍照/相冊權(quán)限
- (void)guideUserOpenAuth{
UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"溫馨提示" message:@"請打開訪問權(quán)限" preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *alertA = [UIAlertAction actionWithTitle:@"確定" style:(UIAlertActionStyleDefault) handler:nil];
UIAlertAction *act = [UIAlertAction actionWithTitle:@"去設(shè)置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// 引導(dǎo)用戶設(shè)置
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}
}];
[alertC addAction:alertA];
[alertC addAction:act];
[self presentViewController:alertC animated:YES completion:nil];
}
UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]) {
UIImage * image;
// 判斷,圖片是否允許修改
if ([picker allowsEditing]){
//獲取用戶編輯之后的圖像
image = [info objectForKey:UIImagePickerControllerEditedImage];
} else {
// 照片的元數(shù)據(jù)參數(shù)
image = [info objectForKey:UIImagePickerControllerOriginalImage];
}
// 壓縮圖片
UIImage *compressImg = [self compressPictureWith:image];
self.imgView.image = compressImg;
// NSLog(@"%@",NSStringFromCGSize(compressImg.size));
// 用于上傳
NSData *tmpData = UIImageJPEGRepresentation(compressImg, 0.5);
}
[self dismissViewControllerAnimated:YES completion:NULL];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self dismissViewControllerAnimated:YES completion:nil];
}
我們獲取的圖片上傳到服務(wù)器,都需要圖片壓縮,這也有,是不是很貼心
/ 壓縮圖片
- (UIImage *)compressPictureWith:(UIImage *)originnalImage{
CGFloat ruleWidth = 600;
if (originnalImage.size.width < ruleWidth) {
return originnalImage;
}
CGFloat hight = ruleWidth/originnalImage.size.width * originnalImage.size.height;
CGRect rect = CGRectMake(0, 0, ruleWidth, hight);
// 開啟圖片上下文
UIGraphicsBeginImageContext(rect.size);
// 將圖片渲染到圖片上下文
[originnalImage drawInRect:rect];
// 獲取圖片
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
// 關(guān)閉圖片上下文
UIGraphicsEndImageContext();
return img;
}
....
以后有時間再將打開界面優(yōu)化一下