守約而來---相冊多選,相機選擇

前言

經過幾天的斷斷續續的編寫終于把這一個小項目完成了,現在剛剛完成,代碼看著不整潔,請多包涵。前幾天要弄個相冊多選和照相選圖的功能,以前做過單選上傳頭像之類的。但是多選確實不像那么簡單,github找了好多的例子,都是在用幾個框架。不是說人家封的不好,封的很好,但是鹵煮比較笨,看了好久還是馬馬虎虎。然后上網查了下資料,還是決定自己寫一個。

demo傳送門在此,哈哈哈

正文

多選主要是需要一個frameworks:AssetsLibrary。這個類的主要功能就是多選(個人理解,不對請見諒)。

首先,我們從相冊開始:要查看所有的相冊,簡單的思路大家應該都有:獲取相冊組---獲取相冊,但是怎么進行呢,AssetsLibrary的用處來了。


- (void)countOfAlbumGroup:(void(^)(ALAssetsGroup *yfGroup))block{        //計算有幾個相冊  

  [self enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {               

 if (group) {           

 [group setAssetsFilter:[ALAssetsFilter allPhotos]];           

 if (block) {               

 block(group);        

    }       

 }   

 } failureBlock:^(NSError *error) {  

      NSLog(@"獲取相冊錯誤,%@",error);    }];   

 }

這個是計算相冊數,可能手機相冊會有好幾個,所以要查看一下有幾個,畢竟用戶有很大的可能只會選擇某一個相冊里面的某一張相片。我是把這個方法拿了出來專門創建了一個類,這樣代碼思路會清晰一些。既然我們知道有幾個相冊了,每個相冊的一些信息也知道了,那么我們應該去顯示某一個相冊里面的所有照片了呀。這一步的代碼來了:


/** *  獲得一個相冊有多少照片 * */

- (void)callAllPhoto:(ALAssetsGroup *)group result:(void(^)(YFSelfImage *image))block{        //獲得所有的圖片資源   

 [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {        if (result) {           

 YFSelfImage *image = [[YFSelfImage alloc]initWithCGImage:[result thumbnail]];            image.asset = result;          

  block(image);    

    }    }];}

這個方法的一個參數group,就是上一個代碼段得到的相冊group,拿到group之后就去求里面所有的照片。這里涉及到兩個點我說一下:### YFSelfImage這是一個我自己稍微封裝了uiimage的一個類


/** *  用于儲存相冊圖片,附有一個asset信息,用于圖片的其他處理 * */#import#import@interface YFSelfImage : UIImage

//可能需要的圖片信息

@property(nonatomic,strong)ALAsset *asset;

@end

比普通的UIImage多了一個屬性,asset。這一個就是要說的第二個點。

ALAsset

這一個類應該是多選里面最關聯的一個類了,它有照片的信息關聯,比如縮略圖之類的都可以通過它獲取。所以,我們多選全靠它去做事情。(關于用法和屬性,請google吧,網上有很多很多)。

好了,現在相冊里面的照片也獲取了,我要把它都顯示出來了,哎呀呀呀呀,龜派氣功波~~~~~~


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

YFShowAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SHOWCELL forIndexPath:indexPath];

YFSelfImage *image = [_dataArray objectAtIndex:indexPath.row];

cell.imageView.image = image;

return cell;

}

然后我們可以查看效果了:

相冊組:

相冊組

相冊:

相冊

好了,基本的顯示完成了,大家也看到了,我上面有個完成按鈕。那么我們是不是需要在照片那來個選擇按鈕,然后我們得到選擇的圖片是吧,不然只是實現查看相冊有什么卵用。

再次編輯collectionview:


YFShowAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SHOWCELL forIndexPath:indexPath];

cell.selectBtn.tag = cellIndex;

//按鈕選中塊

__weak typeof(self)weakSelf = self;

cell.selectedBlock = ^(NSInteger index){

//把選中的圖片放倒一個數組里面

[weakSelf.selectedArray addObject:[weakSelf.dataArray objectAtIndex:index]];

selectBtn.userInteractionEnabled = YES;

};

//取消選定

cell.cancelBlock = ^(NSInteger index){

//找出取消的cell

YFSelfImage *oldImage = [weakSelf.dataArray objectAtIndex:index];

//從選中的數組去除

for (YFSelfImage *newImage in weakSelf.selectedArray) {

if (newImage == oldImage) {

//移除

[weakSelf.selectedArray removeObject:newImage];

//判斷完成按鈕是否可以使用

if(weakSelf.selectedArray.count <= 0){

selectBtn.userInteractionEnabled = NO;

}

return ;

}

}

};

YFSelfImage *image = [_dataArray objectAtIndex:cellIndex];

cell.imageView.image = image;

return cell;

}

再來看一下效果:

這里寫圖片描述

好了,現在我們是可以選擇了,現在我們要實現的是把我們選擇的照片拿到放到一個數組里面保存使用。前段代碼大家應該看見了,照片按鈕的選中與取選操作都謝了,我們現在完成“完成”這個按鈕操作了:


/**

*  完成選定

*/

- (void)successChoose{

//把選擇的圖片傳送過去

NSDictionary *dic = @{@"cellImage":self.selectedArray};

[[NSNotificationCenter defaultCenter]postNotificationName:@"pushImage" object:nil userInfo:dic];

//退出模態

[self dismissViewControllerAnimated:YES completion:^{

//這一步確保退出到顯示界面的時候顯示相冊組控制器一定退出

[self.navigationController popViewControllerAnimated:YES];

}];

}

這個有個解釋點:

就是數退出模態后又做了一次導航pop。因為這個項目的界面布局是:

這里寫圖片描述

所以,我從單相冊顯示界面dismiss相當于直接回到開始界面,但是你在下一次在進入相冊組界面的時候會出問題,它會直接進入單相冊顯示界面,也就是說在你dismiss之后后者兩個界面貌似沒有釋放的樣子,還是記住了相冊組界面push到單相冊界面的狀態。所以我在此處做了一個pop,防止出現這個問題。

在完成按鈕時,我已經選擇了通過通知把數組帶回了開始界面。所以開始界面會有我們所選擇的照片的顯示。

這里寫圖片描述

這里說一下,這個刪除事件我就不講了,大家一看應該都懂的。略過~~~~~~

好了,現在開始相機選擇照片這一塊:

首先我們打開一下相冊,固定死代碼:


/**

*  打開相機

*/

- (void)showCamera{

//選擇相機

UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;

UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化

picker.delegate = self;

// picker.allowsEditing = YES;//設置可編輯

picker.sourceType = sourceType;

//進入照相界面

[[self getCurrentVC] presentViewController:picker animated:YES completion:nil];

}

然后嘞,嘎嘎,照了照片之后,我們選擇這張照片,那么學問來了,我們選擇這張照片可以直接去


- (void)imagePickerController:(UIImagePickerController *)picker

didFinishPickingMediaWithInfo:(NSDictionary *)info{}

這個代理里面去做操作,當然為了和相冊多選照片的屬性一致,我們需要做點操作。首先思路應該是把照的照片先放到相冊,然后我們去相冊去拿到這個相冊最后一張圖片,就是這個相機照的圖片。

多說無益,上代碼:


- (void)imagePickerController:(UIImagePickerController *)picker

didFinishPickingMediaWithInfo:(NSDictionary *)info{

//    //圖片

UIImage *image;

//判斷是不是從相機過來的

if (picker.sourceType != UIImagePickerControllerSourceTypePhotoLibrary) {

//關閉相機

[picker dismissViewControllerAnimated:YES completion:nil];

image = [info objectForKey:UIImagePickerControllerOriginalImage];

}

//通過判斷picker的sourceType,如果是拍照則保存到相冊去.非常重要的一步,不然,無法獲取照相的圖片

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

}

}

/**

*  確定相機圖片保存到系統相冊后,進行圖片獲取

*/

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

NSLog(@"已保存");

//操作獲得的照片,我這是直接顯示,你那個你加到你顯示的一組里面去顯示去就好了

ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];

//操作獲得的照片,我這是直接顯示,你那個你加到你顯示的一組里面去顯示去就好了

[library afterCameraAsset:^(ALAsset *asset) {

YFSelfImage *image = [[YFSelfImage alloc]initWithCGImage:asset.thumbnail];

image.asset = asset;

//傳遞

NSDictionary *dic = @{@"saveImage":image};

[[NSNotificationCenter defaultCenter]postNotificationName:@"SAVEIMAGE" object:nil userInfo:dic];

}];

}

好了,現在我們獲到了相機圖片。

然后我還是選擇發送一個通知把照片傳給顯示頁。

結語

好了,好了,不行了,不寫了。應該也差不多了。還有一些小的功能沒有寫,一切都在代碼里面。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,765評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,179評論 4 61
  • 因為這行 ? ? ? 當然不是! 雖然外人眼中的葡萄酒行業很暴利 但是業內人都清楚 做葡萄酒真的... 當我告訴朋...
    SimplyWine閱讀 396評論 0 0
  • 最近上火一直不好,兒子的一句話似乎點醒了我,他說,‘’媽媽你什么事都讓著點,都想開點就好了,慢慢就不上火了。‘’ ...
    雨季不再來2017閱讀 195評論 0 0