照例先上效果圖
本次用的第三方框架做這個,但是需要考慮的地方也比較多,怎麼把拍照和相冊選取結合、刪除照片後添加新照片時候的相冊狀態等等,所有的改變都是在操作數組。還需考慮圖片的壓縮上傳。
本次用的第三方框架為:QBImagePickerController
按照慣例,上代碼,本次代碼較多
第一個控制器 .h裡沒啥代碼
#import "RRZShowEditViewController.h" #import "RRZSendShowTextCell.h" #import "RRZSendShowImageCell.h" #import "QBImagePickerController.h" #import "ShowEditItem.h" static NSString *sendShowTextCellID = @"SendShowTextCellID"; static NSString *sendShowImageCellID = @"SendShowImageCellID"; @interface RRZShowEditViewController ()<UITableViewDataSource, UITableViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIScrollViewDelegate,UIActionSheetDelegate,QBImagePickerControllerDelegate> @property (strong, nonatomic) UITableView *myTableView; /** model*/ @property (strong, nonatomic) ShowEditItem *showEditItem; /** textView的text*/ @property (strong, nonatomic) NSString *valueStr; /** 文本輸入*/ @property (weak, nonatomic) NumberofwordsTextView *textView; @property (strong, nonatomic) QBImagePickerController *imagePickerController; @end @implementation RRZShowEditViewController -(ShowEditItem *)showEditItem{ if (!_showEditItem) { _showEditItem = [[ShowEditItem alloc]init]; _showEditItem.selectedImages = @[].mutableCopy; _showEditItem.selectedAssetURLs = @[].mutableCopy; } return _showEditItem; } -(QBImagePickerController *)imagePickerController{ if (!_imagePickerController) { _imagePickerController = [[QBImagePickerController alloc] init]; _imagePickerController.filterType = QBImagePickerControllerFilterTypePhotos; _imagePickerController.delegate = self; _imagePickerController.allowsMultipleSelection = YES; _imagePickerController.maximumNumberOfSelection = 9; } [_imagePickerController.selectedAssetURLs removeAllObjects]; [_imagePickerController.selectedAssetURLs addObjectsFromArray:self.showEditItem.selectedAssetURLs]; return _imagePickerController; } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; } -(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; } - (void)viewDidLoad { [super viewDidLoad]; self.title = @"曬一曬"; [self setupTabelView]; [self setupNavItem]; } -(void)setupNavItem{ UIBarButtonItem *rightItem = [UIBarButtonItem itemWithTitle:@"發布" highTitle:nil target:self action:@selector(sendClick) norColor:NavItemColor highColor:RGB_COLOR(200, 200, 200)]; self.navigationItem.rightBarButtonItem = rightItem; } // 壓縮圖片 - (NSData *)resetSizeOfImageData:(UIImage *)source_image maxSize:(NSInteger)maxSize { //先調整分辨率 CGSize newSize = CGSizeMake(source_image.size.width, source_image.size.height); CGFloat tempHeight = newSize.height / 1024; CGFloat tempWidth = newSize.width / 1024; if (tempWidth > 1.0 && tempWidth > tempHeight) { newSize = CGSizeMake(source_image.size.width / tempWidth, source_image.size.height / tempWidth); } else if (tempHeight > 1.0 && tempWidth < tempHeight){ newSize = CGSizeMake(source_image.size.width / tempHeight, source_image.size.height / tempHeight); } UIGraphicsBeginImageContext(newSize); [source_image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //調整大小 NSData *imageData; if (UIImagePNGRepresentation(newImage)) { imageData = UIImagePNGRepresentation(newImage); }else{ imageData = UIImageJPEGRepresentation(newImage, 0.5); } NSUInteger sizeOrigin = [imageData length]; NSUInteger sizeOriginKB = sizeOrigin / 1024; if (sizeOriginKB > maxSize) { NSData *finallImageData = UIImageJPEGRepresentation(newImage,0.50); return finallImageData; } return imageData; } -(void)sendClick{ [self.view endEditing:YES]; [HUDController showProgressLabel:@""]; NSString *textStr = self.textView.text; textStr = [textStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; if (textStr.length > 0 || self.showEditItem.selectedImages.count > 0) { DLog(@"發表曬一曬"); NSMutableArray *tempImages = [[NSMutableArray alloc]init]; for (int i = 0; i < self.showEditItem.selectedImages.count; i++) { UIImage *tempImage = self.showEditItem.selectedImages[i]; NSData *imgData = [self resetSizeOfImageData:tempImage maxSize:150]; tempImage = [UIImage imageWithData:imgData]; [tempImages addObject:tempImage]; } [[RRZNetworkController sharedController]sendShowInfoByRemark:self.textView.text myfiles:tempImages success:^(NSDictionary *data) { NSString *code = data[@"code"]; if ([code isEqualToString:@"success"]) { [HUDController hideHUDWithText:@"發表成功"]; if (_sendSuccessBlock) { _sendSuccessBlock(); } [self.navigationController popViewControllerAnimated:YES]; }else{ [HUDController hideHUD]; NSString *message = data[@"message"]; if (message.length > 30) { message = @"上傳失敗"; } UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:nil message:message delegate:nil cancelButtonTitle:@"確認" otherButtonTitles:nil, nil]; [alertView show]; } } failure:^(NSDictionary *error) { [HUDController hideHUDWithText:NetworkError]; }]; }else{ [HUDController hideHUDWithText:@"文字或圖片不能為空"]; } } -(void)setupTabelView{ // 添加myTableView _myTableView = ({ UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; tableView.backgroundColor = [UIColor clearColor]; tableView.dataSource = self; tableView.delegate = self; tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [tableView registerClass:[RRZSendShowTextCell class] forCellReuseIdentifier:sendShowTextCellID]; [tableView registerClass:[RRZSendShowImageCell class] forCellReuseIdentifier:sendShowImageCellID]; [self.view addSubview:tableView]; [tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; tableView; }); } #pragma mark - UITableViewDelegate -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 2; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == 0) { RRZSendShowTextCell *cell = [tableView dequeueReusableCellWithIdentifier:sendShowTextCellID]; self.textView = cell.numberTextView; // cell.textValueChangedBlock = ^(NSString *valueStr){ // weakSelf.valueStr = valueStr; // }; return cell; }else{ RRZSendShowImageCell *cell = [tableView dequeueReusableCellWithIdentifier:sendShowImageCellID]; cell.item = self.showEditItem; __weak typeof(self) weakSelf = self; cell.addPicturesBlock = ^(){ [weakSelf showActionForPhoto]; }; cell.deleteImageBlock = ^(ShowEditItem *item){ weakSelf.showEditItem = item; [weakSelf.myTableView reloadData]; }; return cell; } } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == 0) { return 200; }else{ return 300; } } #pragma mark UIActionSheet M - (void)showActionForPhoto{ UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"從相冊選取", nil]; [actionSheet showInView:self.view]; } #pragma mark - UIActionSheetDelegate -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 0) { DLog(@"拍照"); if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIAlertView *alert= [[UIAlertView alloc] initWithTitle:nil message:@"該設備不支持拍照" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:NULL]; [alert show]; }else{ UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = NO;//設置可編輯 picker.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController:picker animated:YES completion:nil];//進入照相界面 } }else if (buttonIndex == 1){ DLog(@"相冊"); if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { UIAlertView *alert= [[UIAlertView alloc] initWithTitle:nil message:@"該設備不支持從相冊選取文件" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:NULL]; [alert show]; }else{ UINavigationController *navigationController = [[BaseNavigationController alloc] initWithRootViewController:self.imagePickerController]; [self presentViewController:navigationController animated:YES completion:NULL]; } } } #pragma mark UIImagePickerControllerDelegate // 拍照回調 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ UIImage *pickerImage = [info objectForKey:UIImagePickerControllerOriginalImage]; [self.showEditItem.selectedImages addObject:pickerImage]; ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary writeImageToSavedPhotosAlbum:[pickerImage CGImage] orientation:(ALAssetOrientation)pickerImage.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) { [self.showEditItem.selectedAssetURLs addObject:assetURL]; // [self.showEditItem addASelectedAssetURL:assetURL]; [self.myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; }]; [picker dismissViewControllerAnimated:YES completion:^{}]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ [picker dismissViewControllerAnimated:YES completion:nil]; } #pragma mark QBImagePickerControllerDelegate //相冊回調 - (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didSelectAssets:(NSArray *)assets{ [self.showEditItem.selectedImages removeAllObjects]; NSMutableArray *selectedAssetURLs = [NSMutableArray new]; [imagePickerController.selectedAssetURLs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [selectedAssetURLs addObject:obj]; }]; self.showEditItem.selectedAssetURLs = selectedAssetURLs; for (int i = 0; i < assets.count; i++) { ALAsset *asset = assets[i]; UIImage *tempImg = [UIImage imageWithCGImage:asset.defaultRepresentation.fullScreenImage]; [self.showEditItem.selectedImages addObject:tempImg]; } @weakify(self); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ self.showEditItem.selectedAssetURLs = selectedAssetURLs; dispatch_async(dispatch_get_main_queue(), ^{ @strongify(self); [self.myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; }); }); [self dismissViewControllerAnimated:YES completion:nil]; } - (void)qb_imagePickerControllerDidCancel:(QBImagePickerController *)imagePickerController{ [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark - scrollView // 滾動結束編輯 收起鍵盤 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ if (scrollView == self.myTableView) { [self.view endEditing:YES]; } } - (void)dealloc { _myTableView.delegate = nil; _myTableView.dataSource = nil; } @end
第二個控制器 .h
#import <UIKit/UIKit.h> #import "NumberofwordsTextView.h" @interface RRZSendShowTextCell : UITableViewCell @property (weak, nonatomic) NumberofwordsTextView *numberTextView; @end
第二個控制器 .m
#define kTweetContentCell_ContentFont [UIFont systemFontOfSize:16] #import "RRZSendShowTextCell.h" @interface RRZSendShowTextCell() @end @implementation RRZSendShowTextCell - (void)awakeFromNib { [super awakeFromNib]; // Initialization code self.selectionStyle = UITableViewCellSelectionStyleNone; } - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { NumberofwordsTextView *numberTextView = [[NumberofwordsTextView alloc] init]; numberTextView.frame = CGRectMake(7, 7, SCREEN_WIDTH-7*2, 180); numberTextView.wordsMaxNumer = 300; numberTextView.placeHolder = @"寫點什麼來曬一曬吧..."; numberTextView.textFont = [UIFont systemFontOfSize:14]; [self addSubview:numberTextView]; self.numberTextView = numberTextView; } return self; } @end
第三個 .h
#import <UIKit/UIKit.h> #import "ShowEditItem.h" @interface RRZSendShowImageCell : UITableViewCell @property (copy, nonatomic) void (^addPicturesBlock)(); @property (copy, nonatomic) void (^deleteImageBlock)(ShowEditItem *toDelete); @property (nonatomic,strong) ShowEditItem *item; @end .m #define kShowImageCCell_Width floorf((SCREEN_WIDTH - 15*2- 10*3)/4) #import "RRZSendShowImageCell.h" #import "RRZShowEditImageCell.h" #import "UICustomCollectionView.h" static NSString *cellID = @"RRZShowImageCCellID"; @interface RRZSendShowImageCell()<UICollectionViewDelegate,UICollectionViewDataSource> @property (strong, nonatomic) UICustomCollectionView *mediaView; @property (strong, nonatomic) NSMutableDictionary *imageViewsDict; /** <#注釋#>*/ @property (strong, nonatomic) NSArray *imgs; /** <#注釋#>*/ @property (weak, nonatomic) UIButton *deleteBtn; @end @implementation RRZSendShowImageCell -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { self.height = 300; [self setupCollectionView]; self.selectionStyle = UITableViewCellSelectionStyleNone; UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, SCREEN_WIDTH - 20, 1)]; label.backgroundColor = RGB_COLOR(240, 240, 240); [self.contentView addSubview:label]; } return self; } -(void)setupCollectionView{ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init]; layout.itemSize = CGSizeMake(kShowImageCCell_Width, kShowImageCCell_Width); self.mediaView = [[UICustomCollectionView alloc]initWithFrame:CGRectMake(15, 10, SCREEN_WIDTH - 2 * 15, 280) collectionViewLayout:layout]; self.mediaView.scrollEnabled = NO; [self.mediaView setBackgroundColor:[UIColor clearColor]]; [self.mediaView registerNib:[UINib nibWithNibName:NSStringFromClass([RRZShowEditImageCell class]) bundle:nil] forCellWithReuseIdentifier:cellID]; self.mediaView.dataSource = self; self.mediaView.delegate = self; [self.contentView addSubview:self.mediaView]; } -(void)setItem:(ShowEditItem *)item{ _item = item; [self.mediaView reloadData]; } #pragma mark - UICollectionViewDelegate -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ NSInteger num = self.item.selectedImages.count; return num < 9? num+ 1: num; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ RRZShowEditImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath]; if (indexPath.row < self.item.selectedImages.count) { cell.img = self.item.selectedImages[indexPath.row]; }else{ cell.img = nil; } cell.deleteBtn.tag = indexPath.row; [cell.deleteBtn addTarget:self action:@selector(deleteBtnClick:) forControlEvents:UIControlEventTouchUpInside]; self.deleteBtn = cell.deleteBtn; return cell; } -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == self.item.selectedAssetURLs.count || indexPath.row == self.item.selectedImages.count) { if (_addPicturesBlock) { _addPicturesBlock(); } } } -(void)deleteBtnClick:(UIButton *)btn{ NSInteger index = btn.tag; [self.item.selectedImages removeObjectAtIndex:index]; [self.item.selectedAssetURLs removeObjectAtIndex:index]; if (_deleteImageBlock) { _deleteImageBlock(_item); } } @end
RRZShowEditImageCell.h 就不寫了,就是自定義一個UICollectionViewCell
NumberofwordsTextView 在文中也用到了,就不貼代碼了
總結
以上就是從相機或相冊選取多圖上傳的代碼實現,其他的描述就不寫了,希望這篇文章對大家開發IOS能有一定的幫助,如果有疑問大家可以留言交流。