守約而來(lái)---相冊(cè)多選,相機(jī)選擇

前言

經(jīng)過(guò)幾天的斷斷續(xù)續(xù)的編寫終于把這一個(gè)小項(xiàng)目完成了广匙,現(xiàn)在剛剛完成,代碼看著不整潔恼策,請(qǐng)多包涵鸦致。前幾天要弄個(gè)相冊(cè)多選和照相選圖的功能,以前做過(guò)單選上傳頭像之類的涣楷。但是多選確實(shí)不像那么簡(jiǎn)單分唾,github找了好多的例子,都是在用幾個(gè)框架狮斗。不是說(shuō)人家封的不好绽乔,封的很好,但是鹵煮比較笨碳褒,看了好久還是馬馬虎虎折砸。然后上網(wǎng)查了下資料,還是決定自己寫一個(gè)沙峻。

demo傳送門在此睦授,哈哈哈

正文

多選主要是需要一個(gè)frameworks:AssetsLibrary。這個(gè)類的主要功能就是多選(個(gè)人理解摔寨,不對(duì)請(qǐng)見(jiàn)諒)去枷。

首先,我們從相冊(cè)開(kāi)始:要查看所有的相冊(cè)是复,簡(jiǎn)單的思路大家應(yīng)該都有:獲取相冊(cè)組---獲取相冊(cè)删顶,但是怎么進(jìn)行呢,AssetsLibrary的用處來(lái)了淑廊。


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

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

 if (group) {           

 [group setAssetsFilter:[ALAssetsFilter allPhotos]];           

 if (block) {               

 block(group);        

    }       

 }   

 } failureBlock:^(NSError *error) {  

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

 }

這個(gè)是計(jì)算相冊(cè)數(shù)逗余,可能手機(jī)相冊(cè)會(huì)有好幾個(gè),所以要查看一下有幾個(gè)季惩,畢竟用戶有很大的可能只會(huì)選擇某一個(gè)相冊(cè)里面的某一張相片猎荠。我是把這個(gè)方法拿了出來(lái)專門創(chuàng)建了一個(gè)類坚弱,這樣代碼思路會(huì)清晰一些。既然我們知道有幾個(gè)相冊(cè)了关摇,每個(gè)相冊(cè)的一些信息也知道了荒叶,那么我們應(yīng)該去顯示某一個(gè)相冊(cè)里面的所有照片了呀。這一步的代碼來(lái)了:


/** *  獲得一個(gè)相冊(cè)有多少照片 * */

- (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);    

    }    }];}

這個(gè)方法的一個(gè)參數(shù)group输虱,就是上一個(gè)代碼段得到的相冊(cè)group些楣,拿到group之后就去求里面所有的照片。這里涉及到兩個(gè)點(diǎn)我說(shuō)一下:### YFSelfImage這是一個(gè)我自己稍微封裝了uiimage的一個(gè)類


/** *  用于儲(chǔ)存相冊(cè)圖片宪睹,附有一個(gè)asset信息愁茁,用于圖片的其他處理 * */#import#import@interface YFSelfImage : UIImage

//可能需要的圖片信息

@property(nonatomic,strong)ALAsset *asset;

@end

比普通的UIImage多了一個(gè)屬性,asset亭病。這一個(gè)就是要說(shuō)的第二個(gè)點(diǎn)鹅很。

ALAsset

這一個(gè)類應(yīng)該是多選里面最關(guān)聯(lián)的一個(gè)類了,它有照片的信息關(guān)聯(lián)罪帖,比如縮略圖之類的都可以通過(guò)它獲取促煮。所以,我們多選全靠它去做事情整袁。(關(guān)于用法和屬性菠齿,請(qǐng)google吧,網(wǎng)上有很多很多)坐昙。

好了绳匀,現(xiàn)在相冊(cè)里面的照片也獲取了,我要把它都顯示出來(lái)了炸客,哎呀呀呀呀疾棵,龜派氣功波~~~~~~


- (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;

}

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

相冊(cè)組:

相冊(cè)組

相冊(cè):

相冊(cè)

好了,基本的顯示完成了痹仙,大家也看到了陋桂,我上面有個(gè)完成按鈕。那么我們是不是需要在照片那來(lái)個(gè)選擇按鈕蝶溶,然后我們得到選擇的圖片是吧嗜历,不然只是實(shí)現(xiàn)查看相冊(cè)有什么卵用。

再次編輯collectionview:


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

cell.selectBtn.tag = cellIndex;

//按鈕選中塊

__weak typeof(self)weakSelf = self;

cell.selectedBlock = ^(NSInteger index){

//把選中的圖片放倒一個(gè)數(shù)組里面

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

selectBtn.userInteractionEnabled = YES;

};

//取消選定

cell.cancelBlock = ^(NSInteger index){

//找出取消的cell

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

//從選中的數(shù)組去除

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;

}

再來(lái)看一下效果:

這里寫圖片描述

好了抖所,現(xiàn)在我們是可以選擇了梨州,現(xiàn)在我們要實(shí)現(xiàn)的是把我們選擇的照片拿到放到一個(gè)數(shù)組里面保存使用。前段代碼大家應(yīng)該看見(jiàn)了田轧,照片按鈕的選中與取選操作都謝了暴匠,我們現(xiàn)在完成“完成”這個(gè)按鈕操作了:


/**

*  完成選定

*/

- (void)successChoose{

//把選擇的圖片傳送過(guò)去

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

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

//退出模態(tài)

[self dismissViewControllerAnimated:YES completion:^{

//這一步確保退出到顯示界面的時(shí)候顯示相冊(cè)組控制器一定退出

[self.navigationController popViewControllerAnimated:YES];

}];

}

這個(gè)有個(gè)解釋點(diǎn):

就是數(shù)退出模態(tài)后又做了一次導(dǎo)航pop。因?yàn)檫@個(gè)項(xiàng)目的界面布局是:

這里寫圖片描述

所以傻粘,我從單相冊(cè)顯示界面dismiss相當(dāng)于直接回到開(kāi)始界面每窖,但是你在下一次在進(jìn)入相冊(cè)組界面的時(shí)候會(huì)出問(wèn)題帮掉,它會(huì)直接進(jìn)入單相冊(cè)顯示界面,也就是說(shuō)在你dismiss之后后者兩個(gè)界面貌似沒(méi)有釋放的樣子窒典,還是記住了相冊(cè)組界面push到單相冊(cè)界面的狀態(tài)蟆炊。所以我在此處做了一個(gè)pop,防止出現(xiàn)這個(gè)問(wèn)題瀑志。

在完成按鈕時(shí)涩搓,我已經(jīng)選擇了通過(guò)通知把數(shù)組帶回了開(kāi)始界面。所以開(kāi)始界面會(huì)有我們所選擇的照片的顯示劈猪。

這里寫圖片描述

這里說(shuō)一下昧甘,這個(gè)刪除事件我就不講了,大家一看應(yīng)該都懂的战得。略過(guò)~~~~~~

好了充边,現(xiàn)在開(kāi)始相機(jī)選擇照片這一塊:

首先我們打開(kāi)一下相冊(cè),固定死代碼:


/**

*  打開(kāi)相機(jī)

*/

- (void)showCamera{

//選擇相機(jī)

UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;

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

picker.delegate = self;

// picker.allowsEditing = YES;//設(shè)置可編輯

picker.sourceType = sourceType;

//進(jìn)入照相界面

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

}

然后嘞常侦,嘎嘎浇冰,照了照片之后,我們選擇這張照片刮吧,那么學(xué)問(wèn)來(lái)了,我們選擇這張照片可以直接去


- (void)imagePickerController:(UIImagePickerController *)picker

didFinishPickingMediaWithInfo:(NSDictionary *)info{}

這個(gè)代理里面去做操作掖蛤,當(dāng)然為了和相冊(cè)多選照片的屬性一致杀捻,我們需要做點(diǎn)操作。首先思路應(yīng)該是把照的照片先放到相冊(cè)蚓庭,然后我們?nèi)ハ鄡?cè)去拿到這個(gè)相冊(cè)最后一張圖片致讥,就是這個(gè)相機(jī)照的圖片。

多說(shuō)無(wú)益器赞,上代碼:


- (void)imagePickerController:(UIImagePickerController *)picker

didFinishPickingMediaWithInfo:(NSDictionary *)info{

//    //圖片

UIImage *image;

//判斷是不是從相機(jī)過(guò)來(lái)的

if (picker.sourceType != UIImagePickerControllerSourceTypePhotoLibrary) {

//關(guān)閉相機(jī)

[picker dismissViewControllerAnimated:YES completion:nil];

image = [info objectForKey:UIImagePickerControllerOriginalImage];

}

//通過(guò)判斷picker的sourceType垢袱,如果是拍照則保存到相冊(cè)去.非常重要的一步,不然港柜,無(wú)法獲取照相的圖片

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

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

}

}

/**

*  確定相機(jī)圖片保存到系統(tǒng)相冊(cè)后请契,進(jìn)行圖片獲取

*/

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

NSLog(@"已保存");

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

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

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

[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];

}];

}

好了畔柔,現(xiàn)在我們獲到了相機(jī)圖片氯夷。

然后我還是選擇發(fā)送一個(gè)通知把照片傳給顯示頁(yè)。

結(jié)語(yǔ)

好了靶擦,好了腮考,不行了雇毫,不寫了。應(yīng)該也差不多了踩蔚。還有一些小的功能沒(méi)有寫棚放,一切都在代碼里面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寂纪,一起剝皮案震驚了整個(gè)濱河市席吴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捞蛋,老刑警劉巖孝冒,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拟杉,居然都是意外死亡庄涡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門搬设,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)穴店,“玉大人,你說(shuō)我怎么就攤上這事拿穴∑矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵默色,是天一觀的道長(zhǎng)球凰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腿宰,這世上最難降的妖魔是什么呕诉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮吃度,結(jié)果婚禮上甩挫,老公的妹妹穿的比我還像新娘。我一直安慰自己椿每,他們只是感情好伊者,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著间护,像睡著了一般删壮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兑牡,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天央碟,我揣著相機(jī)與錄音,去河邊找鬼。 笑死亿虽,一個(gè)胖子當(dāng)著我的面吹牛菱涤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洛勉,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粘秆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了收毫?” 一聲冷哼從身側(cè)響起攻走,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎此再,沒(méi)想到半個(gè)月后昔搂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡输拇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年摘符,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片策吠。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逛裤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猴抹,到底是詐尸還是另有隱情带族,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布蟀给,位于F島的核電站蝙砌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坤溃。R本人自食惡果不足惜拍霜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一嘱丢、第九天 我趴在偏房一處隱蔽的房頂上張望薪介。 院中可真熱鬧,春花似錦越驻、人聲如沸汁政。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)记劈。三九已至,卻和暖如春并巍,著一層夾襖步出監(jiān)牢的瞬間目木,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工懊渡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刽射,地道東北人军拟。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像誓禁,于是被迫代替她去往敵國(guó)和親懈息。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,327評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)摹恰、插件辫继、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評(píng)論 4 61
  • 因?yàn)檫@行 姑宽? ? 姜盈? 當(dāng)然不是低千! 雖然外人眼中的葡萄酒行業(yè)很暴利 但是業(yè)內(nèi)人都清楚 做葡萄酒真的... 當(dāng)我告訴朋...
    SimplyWine閱讀 393評(píng)論 0 0
  • 最近上火一直不好,兒子的一句話似乎點(diǎn)醒了我馏颂,他說(shuō)示血,‘’媽媽你什么事都讓著點(diǎn),都想開(kāi)點(diǎn)就好了救拉,慢慢就不上火了难审。‘’ ...
    雨季不再來(lái)2017閱讀 193評(píng)論 0 0