ios利用 AFN 上傳相冊(cè)或者拍照?qǐng)D片
由于項(xiàng)目中多處需要上傳圖片,我們可以自定義上傳圖片請(qǐng)求,自定義調(diào)取相冊(cè)及拍照,方便多處使用時(shí)調(diào)用。
主要步驟:
1.第一步:請(qǐng)求上傳你選取的相冊(cè)圖片或者拍照?qǐng)D片(經(jīng)過(guò)壓縮處理)
2.第二步:獲取到第一步圖片url上傳給服務(wù)器
3.第三步:回顯圖片(當(dāng)然進(jìn)入該界面時(shí)先判斷是否有圖片,無(wú)圖則展示占位圖片,否則就回顯圖片)
廢話不多說(shuō),直接上代碼:
1)封裝的上傳圖片的網(wǎng)絡(luò)請(qǐng)求(圖片壓縮) QTXUploadImage 文件
// 利用 afn 上傳一張圖片 #import <Foundation/Foundation.h> @interface QTXUploadImage : NSObject // 上傳圖片的網(wǎng)絡(luò)請(qǐng)求(圖片壓縮) + (void)post:(NSString *)url image:(UIImage *)image name:(NSString *)name success:(void (^)(id json))success failure:(void (^)(NSError *error))failure; @end
#import "QTXUploadImage.h"
#import "AFNetworking.h"
#import "QTXAccount.h"
#import "QTXAccountTool.h"
@implementation QTXUploadImage
/**
* 上傳圖片的網(wǎng)絡(luò)請(qǐng)求(圖片壓縮)
*
* @param url 上傳圖片的網(wǎng)絡(luò)請(qǐng)求地址
* @param name 和后臺(tái)包名一致
*
*/
+ (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.拼接請(qǐng)求參數(shù)url 也可在具體控制器請(qǐng)求里傳入
NSDictionary *dict = @{@"userId" : [QTXAccountTool account].userId};
// 3.發(fā)送請(qǐng)求
[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)封裝的拍照/從相冊(cè)選擇 QTXImagePicker 文件
// 拍照/從相冊(cè)選擇
#import <Foundation/Foundation.h>
typedef void(^QTXImagePickerFinishAction)(UIImage *image);
@interface QTXImagePicker : NSObject
/**
@param viewController 用于present UIImagePickerController對(duì)象
@param allowsEditing 是否允許用戶編輯圖像
*/
+ (void)showImagePickerFromViewController:(UIViewController *)viewController
allowsEditing:(BOOL)allowsEditing
finishAction:(QTXImagePickerFinishAction)finishAction;
@end
#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:@"拍照", @"從相冊(cè)選擇", nil];
}else {
sheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"從相冊(cè)選擇", 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:@"從相冊(cè)選擇"]) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
// [picker.navigationBar setBarTintColor:QTXNavColor]; // 修改相冊(cè)的導(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)使用時(shí),在所需使用的控制器里調(diào)用:
[QTXImagePicker showImagePickerFromViewController:self allowsEditing:YES finishAction:^(UIImage *image) {
if (image) {
self.idSideImage = image;
[QTXUploadImage post:QTX_xsz1Url image:image name:@"xsz1" success:^(id json) {
// 第一步請(qǐng)求上傳
QTXLog(@"圖像上傳請(qǐng)求成功 %@", json);
self.idSide = json[@"data"];
} failure:^(NSError *error) {
QTXLog(@"學(xué)生證圖像上傳請(qǐng)求失敗 %@", error);
}];
}
}];
第二步和第三步 需要和各位自己后臺(tái)server聯(lián)調(diào),就屬于普通的get/post請(qǐng)求了,這邊就不放代碼了喲
插一下,我們產(chǎn)品沒(méi)讓拍照的照片存儲(chǔ)到相冊(cè)
// 存儲(chǔ)圖片名稱: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];
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS框架AVFoundation實(shí)現(xiàn)相機(jī)拍照、錄制視頻
- iOS仿微信相機(jī)拍照、視頻錄制功能
- IOS UIImagePickerController從拍照、圖庫(kù)、相冊(cè)獲取圖片
- JS解決IOS中拍照?qǐng)D片預(yù)覽旋轉(zhuǎn)90度BUG的問(wèn)題
- Android 實(shí)現(xiàn)IOS選擇拍照相冊(cè)底部彈出的實(shí)例
- iOS拍照后圖片自動(dòng)旋轉(zhuǎn)90度的完美解決方法
- 詳解利用exif.js解決ios手機(jī)上傳豎拍照片旋轉(zhuǎn)90度問(wèn)題
- iOS視頻錄制(或選擇)壓縮及上傳功能(整理)
- iOS自定義相機(jī)實(shí)現(xiàn)拍照、錄制視頻
相關(guān)文章
iOS實(shí)現(xiàn)新年抽獎(jiǎng)轉(zhuǎn)盤(pán)效果的思路
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤(pán)效果的思路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
在iOS10系統(tǒng)中微信后退無(wú)法發(fā)起ajax請(qǐng)求的問(wèn)題解決辦法
這篇文章主要介紹了在iOS10系統(tǒng)中微信后退無(wú)法發(fā)起ajax請(qǐng)求的問(wèn)題解決辦法,一般可以通過(guò)延時(shí)發(fā)送請(qǐng)求解決,下面通過(guò)本文給大家分享下解決辦法,需要的朋友參考下吧2017-01-01
詳解Objective-C設(shè)計(jì)模式編程中對(duì)備忘錄模式的運(yùn)用
iOS仿抖音視頻加載動(dòng)畫(huà)效果的實(shí)現(xiàn)方法
iOS對(duì)數(shù)組進(jìn)行排序的實(shí)例代碼

