由于項目中多處需要上傳圖片,我們可以自定義上傳圖片請求,自定義調(diào)取相冊及拍照,方便多處使用時調(diào)用。
主要步驟:
1.第一步:請求上傳你選取的相冊圖片或者拍照圖片(經(jīng)過壓縮處理)
2.第二步:獲取到第一步圖片url上傳給服務(wù)器
3.第三步:回顯圖片(當(dāng)然進(jìn)入該界面時先判斷是否有圖片,無圖則展示占位圖片,否則就回顯圖片)
廢話不多說,直接上代碼:
1)封裝的上傳圖片的網(wǎng)絡(luò)請求(圖片壓縮) QTXUploadImage 文件
1
2
3
4
5
6
7
8
9
|
// 利用 afn 上傳一張圖片 #import <Foundation/Foundation.h> @interface QTXUploadImage : NSObject // 上傳圖片的網(wǎng)絡(luò)請求(圖片壓縮) + ( void )post:(NSString *)url image:(UIImage *)image name:(NSString *)name success:( void (^)(id json))success failure:( void (^)(NSError *error))failure; @end |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#import "QTXUploadImage.h" #import "AFNetworking.h" #import "QTXAccount.h" #import "QTXAccountTool.h" @implementation QTXUploadImage /** * 上傳圖片的網(wǎng)絡(luò)請求(圖片壓縮) * * @param url 上傳圖片的網(wǎng)絡(luò)請求地址 * @param name 和后臺包名一致 * */ + ( void )post:(NSString *)url image:(UIImage *)image name:(NSString *)name success:( void (^)(id json))success failure:( void (^)(NSError *error))failure { // 1.創(chuàng)建網(wǎng)絡(luò)管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.拼接請求參數(shù)url 也可在具體控制器請求里傳入 NSDictionary *dict = @{@ "userId" : [QTXAccountTool account].userId}; // 3.發(fā)送請求 [manager POST:url parameters:dict constructingBodyWithBlock: ^ void (id<AFMultipartFormData> formData) { NSData *imageData = UIImageJPEGRepresentation(image, 0.5); //進(jìn)行圖片壓縮 // 使用日期生成圖片名稱 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @ "yyyyMMddHHmmss" ; NSString *fileName = [NSString stringWithFormat:@ "%@.png" ,[formatter stringFromDate:[NSDate date]]]; // 任意的二進(jìn)制數(shù)據(jù)MIMEType application/octet-stream [formData appendPartWithFileData:imageData name:name fileName:fileName mimeType:@ "image/png" ]; } success:^ void (NSURLSessionDataTask * task, id responseObject) { if (success) { success(responseObject); } } failure:^ void (NSURLSessionDataTask * task, NSError * error) { if (failure) { failure(error); } }]; } @end |
2)封裝的拍照/從相冊選擇 QTXImagePicker 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 拍照/從相冊選擇 #import <Foundation/Foundation.h> typedef void (^QTXImagePickerFinishAction)(UIImage *image); @interface QTXImagePicker : NSObject /** @param viewController 用于present UIImagePickerController對象 @param allowsEditing 是否允許用戶編輯圖像 */ + ( void )showImagePickerFromViewController:(UIViewController *)viewController allowsEditing:( BOOL )allowsEditing finishAction:(QTXImagePickerFinishAction)finishAction; @end |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#import "QTXImagePicker.h" @interface QTXImagePicker()<UIActionSheetDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate> @property (nonatomic, weak) UIViewController *viewController; @property (nonatomic, copy) QTXImagePickerFinishAction finishAction; @property (nonatomic, assign) BOOL allowsEditing; @end static QTXImagePicker *qtxImagePickerInstance = nil; @implementation QTXImagePicker + ( void )showImagePickerFromViewController:(UIViewController *)viewController allowsEditing:( BOOL )allowsEditing finishAction:(QTXImagePickerFinishAction)finishAction { if (qtxImagePickerInstance == nil) { qtxImagePickerInstance = [[QTXImagePicker alloc] init]; } [qtxImagePickerInstance showImagePickerFromViewController:viewController allowsEditing:allowsEditing finishAction:finishAction]; } - ( void )showImagePickerFromViewController:(UIViewController *)viewController allowsEditing:( BOOL )allowsEditing finishAction:(QTXImagePickerFinishAction)finishAction { _viewController = viewController; _finishAction = finishAction; _allowsEditing = allowsEditing; UIActionSheet *sheet = nil; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@ "取消" destructiveButtonTitle:nil otherButtonTitles:@ "拍照" , @ "從相冊選擇" , nil]; } else { sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@ "取消" destructiveButtonTitle:nil otherButtonTitles:@ "從相冊選擇" , nil]; } UIView *window = [UIApplication sharedApplication].keyWindow; [sheet showInView:window]; } - ( void )actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { NSString *title = [actionSheet buttonTitleAtIndex:buttonIndex]; if ([title isEqualToString:@ "拍照" ]) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.allowsEditing = _allowsEditing; [_viewController presentViewController:picker animated:YES completion:nil]; } else if ([title isEqualToString:@ "從相冊選擇" ]) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; // [picker.navigationBar setBarTintColor:QTXNavColor]; // 修改相冊的導(dǎo)航條的背景顏色 picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [_viewController presentViewController:picker animated:YES completion:nil]; } else { qtxImagePickerInstance = nil; } } - ( void )imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = info[UIImagePickerControllerEditedImage]; if (image == nil) { image = info[UIImagePickerControllerOriginalImage]; } if (_finishAction) { _finishAction(image); } [picker dismissViewControllerAnimated:YES completion:^{}]; qtxImagePickerInstance = nil; } - ( void )imagePickerControllerDidCancel:(UIImagePickerController *)picker { if (_finishAction) { _finishAction(nil); } [picker dismissViewControllerAnimated:YES completion:^{}]; qtxImagePickerInstance = nil; } @end |
當(dāng)使用時,在所需使用的控制器里調(diào)用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[QTXImagePicker showImagePickerFromViewController:self allowsEditing:YES finishAction:^(UIImage *image) { if (image) { self.idSideImage = image; [QTXUploadImage post:QTX_xsz1Url image:image name:@ "xsz1" success:^(id json) { // 第一步請求上傳 QTXLog(@ "圖像上傳請求成功 %@" , json); self.idSide = json[@ "data" ]; } failure:^(NSError *error) { QTXLog(@ "學(xué)生證圖像上傳請求失敗 %@" , error); }]; } }]; |
第二步和第三步 需要和各位自己后臺server聯(lián)調(diào),就屬于普通的get/post請求了,這邊就不放代碼了喲
插一下,我們產(chǎn)品沒讓拍照的照片存儲到相冊
1
2
3
4
5
6
7
8
9
|
// 存儲圖片名稱:001.png ~ 009.png for ( int i = 1; i<=9; i++) { UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@ "00%d.png" , i]]; UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); [NSThread sleepForTimeInterval:1]; } |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.jianshu.com/p/990d3e60c1e9?utm_source=tuicool&utm_medium=referral