iOS呼叫相機和相簿 並編輯儲存到本地(個人中心設定頭像)
阿新 • • 發佈:2019-01-27
公司專案需求,需要設定使用者頭像,沒必要用到自定義相機,系統相機完全可以滿足需求,就寫了個小demo測試;
第一步:匯入協議
UINavigationControllerDelegate,UIImagePickerControllerDelegate
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UINavigationControllerDelegate,UIImagePickerControllerDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *imageScroll; @property (weak, nonatomic) IBOutlet UIImageView *photoImage; @end
第二步:開啟相機
#pragma mark - 從相機獲取圖片 - (IBAction)photoFromCamera:(id)sender { if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;//設定型別為相機 UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化 picker.delegate = self;//設定代理 picker.allowsEditing = YES;//設定照片可編輯 picker.sourceType = sourceType; //設定是否顯示相機控制按鈕 預設為YES picker.showsCameraControls = YES; // //建立疊加層(例如新增的相框) // UIView *overLayView=[[UIView alloc]initWithFrame:CGRectMake(0, 120, 320, 254)]; // //取景器的背景圖片,該圖片中間挖掉了一塊變成透明,用來顯示攝像頭獲取的圖片; // UIImage *overLayImag=[UIImage imageNamed:@"zhaoxiangdingwei.png"]; // UIImageView *bgImageView=[[UIImageView alloc]initWithImage:overLayImag]; // [overLayView addSubview:bgImageView]; // picker.cameraOverlayView=overLayView; //選擇前置攝像頭或後置攝像頭 picker.cameraDevice=UIImagePickerControllerCameraDeviceFront; [self presentViewController:picker animated:YES completion:^{ }]; } else { NSLog(@"該裝置無相機"); } }
第三步:呼叫相簿
第四步:從相簿選擇圖片後操作#pragma mark - 從相簿獲取圖片 - (IBAction)photoFromAlbum:(id)sender { //首先需要判斷資源是否可用 if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init]; pickerImage.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //獲得相機模式下支援的媒體型別 // pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType]; pickerImage.delegate = self; //設定允許編輯 pickerImage.allowsEditing = YES; [self presentViewController:pickerImage animated:YES completion:^{ }]; } }
#pragma mark - 從相簿選擇圖片後操作
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
//NSLog(@"%@",info);
//獲取源影象(未經裁剪)
// UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
//獲取裁剪後的影象
UIImage *image = info[UIImagePickerControllerEditedImage];
//將照片存到媒體庫
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
self.photoImage.image = image;
//將照片存到沙盒
[self saveImage:image];
[picker dismissViewControllerAnimated:YES completion:^{
}];
}
第五步:照片存到本地後的回撥
#pragma mark - 照片存到本地後的回撥
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{
if (!error) {
NSLog(@"儲存成功");
} else {
NSLog(@"儲存失敗:%@", error);
}
}
第六步:儲存圖片
#pragma mark - 儲存圖片
- (void) saveImage:(UIImage *)currentImage {
//設定照片的品質
NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
NSLog(@"%@",NSHomeDirectory());
// 獲取沙盒目錄
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/currentImage.png"];
// 將圖片寫入檔案
[imageData writeToFile:filePath atomically:NO];
//將選擇的圖片顯示出來
// [self.photoImage setImage:[UIImage imageWithContentsOfFile:filePath]];
}
第七步:取消操作呼叫
#pragma mark - 取消操作時呼叫
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:^{
}];
}
群裡有一個夥計呼叫系統相簿、相機發現是英文的系統相簿介面後標
題顯示“photos”,但是手機語言已經設定顯示中文,糾結半天,最終在info.plist設定解
決問題,我反正閒著也是沒事於是就搜尋了下相關的資料
發現在專案的info.plist裡面新增Localized resources can be mixed 為 YES(表示是否允
許應用程式獲取框架庫內語言)即可解決這個問題。