標籤:
一、功能簡介
1、封裝了一個按鈕,點擊按鈕,會提示從何處擷取圖片:如果裝置支援相機,可以從相機擷取,同時還可以從手機相簿擷取圖片。
2、選擇圖片後,有一個block回調,根據需求,將獲得的圖片拿來使用。
3、提供了初始化方法,可以靈活定義按鈕,包括把返回的圖片設定給按鈕自己。
二、核心原理
1、UIAlertController 提示框
2、UIImagePickerController 圖片拾取控制器
3、isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera 類方法,判斷是否支援相機
4、遵守UIImagePickerControllerDelegate,UINavigationControllerDelegate
5、實現代理方法獲得圖片:- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
6、UIImageJPEGRepresentation 方法將圖片壓縮轉換層NSData,然後寫入沙箱
三、源碼
1、.h檔案
@interface ZQImageToolsButton : UIButton/** * 可以獲得儲存圖片資訊的字典,裡麵包含了沙箱裡的圖片完整路徑(程式每次運行沙箱的路徑可能會不同,但是圖片名不變) * * @return */-(NSDictionary * )getImageInfro;/** * 初始化方法,點擊按鈕可以選擇從相簿或是相機(如果有相機)選擇圖片並返回圖片 * * @param title 按鈕的名字 * @param frame 按鈕的frame * @param controller 按鈕所在的控制器,彈出對話方塊的控制器 * @param block 獲得圖片後的回調 * @param imageName 儲存在沙箱裡圖片的名字 * * @return 返回一個按鈕 */-(instancetype)initWithTitle:(NSString *)title frame:(CGRect)frame controller:(UIViewController *)controller imageBlock:(void(^)(UIImage *))block imageName :(NSString *)imageName;@end
2、.m檔案
@interface ZQImageToolsButton() <UIImagePickerControllerDelegate,UINavigationControllerDelegate>@property(nonatomic,weak) UIViewController * controller;@property(nonatomic,copy) void(^imageBlock)(UIImage *) ;@property(nonatomic,strong) NSString * imageName;@property(nonatomic,strong) NSDictionary * imageInfro;@end@implementation ZQImageToolsButton-(NSDictionary * )getImageInfro{ return self.imageInfro;}-(instancetype)initWithTitle:(NSString *)title frame:(CGRect)frame controller:(UIViewController *)controller imageBlock:(void(^)(UIImage *))block imageName :(NSString *)imageName{ self = [[ZQImageToolsButton alloc]initWithFrame:frame]; self.imageBlock = block; self.controller = controller; self.imageName = imageName; [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [self setTitle:title forState:UIControlStateNormal]; [self addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; return self ;}- (void)btnClick:(UIButton *) btn{ // 建立圖片管理器、 跳轉到相機或相簿頁面 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.delegate = self; imagePickerController.allowsEditing = YES; //建立彈框 UIAlertController * av = [UIAlertController alertControllerWithTitle:@"選擇" message:@"從您的相簿/相機選擇" preferredStyle:UIAlertControllerStyleActionSheet]; //設定image管理器的源類型 __block NSInteger sourceType = 0; UIAlertAction * photo = [UIAlertAction actionWithTitle:@"我的相簿" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //圖片源為相簿 sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; imagePickerController.sourceType = sourceType; [self.controller presentViewController:imagePickerController animated:YES completion:^{}]; }]; UIAlertAction * camera = [UIAlertAction actionWithTitle:@"我的相機" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //圖片源為相機 sourceType = UIImagePickerControllerSourceTypeCamera; imagePickerController.sourceType = sourceType; [self.controller presentViewController:imagePickerController animated:YES completion:^{}]; }]; UIAlertAction * cancle = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { //取消 }]; //判斷是否支援相機 if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { [av addAction:photo]; [av addAction:camera]; [av addAction:cancle]; } else { //如果不支援相機,就不用把相機按鈕加入提示框了 [av addAction:photo]; [av addAction:cancle]; } [self.controller presentViewController:av animated:YES completion:nil]; }// 圖片選擇結束之後,走這個方法,字典存放所有圖片資訊#pragma mark - image picker delegte 系統代理程式,返回從相簿中選中的圖片- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ [picker dismissViewControllerAnimated:YES completion:^{ NSLog(@"選好圖片了"); }]; //獲得選中的圖片了! UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; //block回調,獲得圖片後,交給控制器 self.imageBlock(image); // 儲存圖片至本地,用傳進來的名字重新拼接圖片名字 NSString * imgName = [NSString stringWithFormat:@"SavedImage-%@.png",self.imageName]; //拼接儲存至沙箱的路徑 NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imgName]; //記錄一片的資訊,存到字典中,需要的時候可以訪問 NSDictionary *dic = @{@"image":fullPath}; self.imageInfro = dic; //儲存到沙箱 [self saveImage:image withName:imgName filePath:fullPath]; }//儲存至沙箱- (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName filePath:(NSString *)filePath{ //壓縮比例0.5 NSData * imageData = UIImageJPEGRepresentation(currentImage, 0.5); // 將圖片寫入檔案 [imageData writeToFile:filePath atomically:NO];}@end
四、擴充
1、本例沒有實現圖片的多選
2、本例沒有實現上傳圖片的商務邏輯
3、小東西,供娛樂交流使用
iOS擷取相簿/相機圖片-------自訂擷取圖片小控制項