原文地址:http://www.codeceo.com/article/ios-weixin-image-picker.html
前段時間空余時間比較多冈敛,打算嘗試做一個圖片選擇器出來,仔細對比了很多自定義了圖片選擇器的應用卿泽,感覺最喜歡微信的界面效果,當然微博的功能更強大滋觉,還支持了LivePhoto签夭,所以打算模仿微信的界面效果,瞄著微博的功能去做一個圖片選擇器出來椎侠。
一.? TZImagePickerController簡介
這個圖片選擇器還沒達到我理想中的效果第租,但是最近工作開始忙起來了,所以有一些功能放在以后加入吧我纪。目前這個圖片選擇器:
(1)支持圖片多選慎宾、選原圖和視頻;
(2)支持預覽圖片和視頻浅悉;
(3)適配了iOS6~9趟据;
總體上跟微信的照片選擇器界面和功能都差不多一樣,當然我這個弱不少…效果圖如下:
1. TZPhotoPickerController术健,照片選擇控制器
2.TZPhotoPreviewController汹碱,照片預覽控制器
3.TZVideoPlayerController,視頻預覽控制器
對照片選擇器要求不是很高的應用來說荞估,這個圖片選擇器還算是夠用了咳促,這段時間考察了github上若干個支持多選的圖片選擇器,界面效果和功能都比這個差些勘伺,可能是有更好的我沒發(fā)現(xiàn)吧…
二.? 如何集成
該圖片選擇器支持 CocoaPods 跪腹, 在你的 Podfile 文件中加入 ?pod ‘TZImagePickerController’, ‘~> 1.0.0′ 即可集成。
如果你喜歡手動導入飞醉,到github下載代碼后冲茸,將TZImagePickerController文件夾拖入到你的項目中,再 #import “TZImagePickerController.h” 即可缅帘。
集成這個圖片選擇器噪裕,最少只需要三行代碼,用起來還是很方便股毫,可以節(jié)省開發(fā)者的時間膳音,把更多的時間和精力花在業(yè)務邏輯和自己想鉆研的技術(shù)點上去。
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:9delegate:self];// You can get the photos by block, the same as by delegate.// 你可以通過block或者代理铃诬,來得到用戶選擇的照片.[imagePickerVc setDidFinishPickingPhotosHandle:^(NSArray *photos,NSArray*assets) {? ? }];? ? [selfpresentViewController:imagePickerVc animated:YEScompletion:nil];
代碼截圖如下 :
三. 相關類的介紹
1. TZImageManager
:唯一import了和的類祭陷,向外界提供有獲取相冊/照片/視頻資源的接口苍凛,在里面每個方法內(nèi)部會判斷系統(tǒng)版本,從而選擇是從
AssetsLibrary庫「iOS9以前可用」 還是從 Photos庫 里獲取照片資源「iOS8以后可用」兵志。
2. TZImagePickerController
:導航欄控制器醇蝴,通過改變該控制器的一些屬性來達到你想要的效果,比如設置maxImagesCount屬性來約束用戶最大可選圖片張數(shù)想罕,默認為9張悠栓;設置allowPickingOriginalPhoto屬性為NO不允許用戶選擇視頻,默認是YES按价;設置allowPickingVideo屬性為NO不允許用戶選擇原圖惭适,默認是YES。
3. TZPhotoPickerController :照片選擇控制器楼镐,一個collectionView每行4個cell展示圖片癞志。
4. TZPhotoPreviewController :照片預覽控制器,用的是collectionView而不是scrollView框产,所以不用處理重用邏輯凄杯,然而圖片的間隙我還沒弄出來…以后再弄吧…
5. TZVideoPlayerController :視頻預覽控制器,簡單的播放/暫停/發(fā)送視頻功能秉宿,用的是AVPlayer來播放戒突。進度條下次有空再加上吧…
6. TZAssetModel :裝有 一個 圖片/視頻/音頻資源的模型,對應一個圖片/視頻Cell「 TZAssetCell 」描睦,資源屬性名為asset 妖谴,可以從 TZImageManager 取出資源對象「圖片/視頻/音頻」。
7. TZAlbumModel :裝有 一個 相冊資源的模型酌摇,對應一個相冊Cell「 TZAlbumCell 」膝舅,資源屬性名為result,可以從 TZImageManager 取出所含有的圖片資源數(shù)組窑多。
四. 微信圖片選擇器的一些技術(shù)點
優(yōu)點實在太多了仍稀,說兩個我發(fā)現(xiàn)的小缺點吧。
小缺點1:在相冊列表頁埂息,空的cell也會顯示技潘,出現(xiàn)許多空的分割線∏Э担「也可能是微信的產(chǎn)品或iOS喜歡這個調(diào)調(diào)…」
我的解決方案:加上這一句 _tableView.tableFooterView = [[UIView alloc] init]; 會不再顯示空的cell享幽。當然也可以隱藏系統(tǒng)的分割線,自己加一個高0.5~1像素的View作為分割線拾弃。
小缺點2:在照片選擇器頁值桩,微信的設計是不允許同時選擇視頻和照片的,但是在照片預覽頁面豪椿,用戶卻可以同時選中視頻和照片奔坟,此時微信會默認將視頻作為圖片發(fā)送携栋,而沒有做一個提示。并且咳秉,如果用戶選擇了發(fā)送原圖婉支,此時視頻雖然也被選中出來了,但是會一直發(fā)送失敗澜建。
我的解決方案:在照片預覽頁面向挖,如果用戶在選擇了圖片的情況下又選擇了視頻,提示用戶會默認將視頻做圖片發(fā)送炕舵。并且在圖片瀏覽器頁面何之,如果預覽到了一個視頻,則將原圖按鈕隱藏幕侠,在計算原圖大小的方法里也會過濾掉視頻資源帝美。
當然微信的圖片選擇器是很優(yōu)秀的碍彭,比如我今天在用iOS6系統(tǒng)的4s真機測試時晤硕,發(fā)現(xiàn)第一次彈出圖片選擇器時,如果相機膠卷相冊圖片數(shù)大于1000庇忌,我的這個會有比較明顯的卡頓舞箍,而微信的卻依然流暢…考慮到這個罕見的iOS6系統(tǒng)4s機子不是我的、工作要開始忙了皆疹、畢竟這只是4s等原因疏橄,這個優(yōu)化就等下次有空再來研究吧…
更具體的信息大家感興趣的話去看代碼吧,如果發(fā)現(xiàn)了bug請?zhí)嵋粋€issue略就,當然最好你給順便解決了并提一個pull request捎迫,這樣最帥了對吧…
代碼地址:https://github.com/banchichen/TZImagePickerController
歡迎使用,覺得不錯請給一個小小的star鼓勵一下~