TZImagePickerController 拍照返回的照片錯(cuò)誤問題

? ? 項(xiàng)目中需要用到相冊(cè)又跛,自己封裝比較耗時(shí),所以選擇了現(xiàn)成的第三方SDK笋庄,選來選去(其實(shí)也沒怎么選)最終選擇了TZImagePickerController(以下簡(jiǎn)稱TZImage)。很舒服的一個(gè)開源相冊(cè)倔监,功能還是很強(qiáng)大直砂,在此膜拜一下作者。

? ? 那么說一說我在使用時(shí)遇到的一個(gè)小問題浩习,如題:

? ? bug:當(dāng)系統(tǒng)相冊(cè)中出現(xiàn)“來自未來的照片”(相冊(cè)中有照片的存儲(chǔ)時(shí)間是未來的某個(gè)時(shí)間静暂,原因暫時(shí)未知,可能是用戶在拍照時(shí)自行修改了iPhone的時(shí)間)谱秽,使用TZImage的拍照功能會(huì)出現(xiàn)最終得到的照片不是拍照獲得的照片問題洽蛀。(有點(diǎn)拗口,應(yīng)該能理解吧)

? ? 問題原因(想看解決方法的同學(xué)們可以跳過):TZImage拍照完成之后疟赊,會(huì)將照片按照當(dāng)前拍攝時(shí)間存入本地相冊(cè)郊供,然后更新相冊(cè),再?gòu)南鄡?cè)中取出當(dāng)前排序的第一張照片返回給我們近哟。而一般來說驮审,相冊(cè)的排序都是按照時(shí)間來排的,不論你是選擇正序還是倒序吉执,所以在正常情況下這樣做是毫無問題的疯淫。但就是有時(shí)候是不正常的。就像我上面描述所說的:系統(tǒng)相冊(cè)中出現(xiàn)來自未來的照片戳玫,這種情況下熙掺,TZImage拍照后獲得的照片永遠(yuǎn)都是相冊(cè)中的第一張照片。然而我們拍攝得到的照片是當(dāng)前時(shí)間咕宿,肯定不會(huì)被放在相冊(cè)的第一張了币绩,也就出現(xiàn)了所拍不所得的問題蜡秽。(很尷尬)

? ? 既然發(fā)現(xiàn)的問題的原因,那么解決起來就方便多了类浪。先來說說我的思路载城,其實(shí)這個(gè)問題不算很難解決,我能想到3種解決方法费就。(原諒我這個(gè)菜雞就這點(diǎn)水平)

? ? 1诉瓦、在TZImage拍攝完照片的代理中取到當(dāng)前拍攝的照片,使用block或者代理傳遞到我們需要的地方力细,跳過存儲(chǔ)和更新相冊(cè)的過程睬澡。

? ? 這種方案簡(jiǎn)單暴力,解決起來應(yīng)該是最快的方式眠蚂∩反希可是對(duì)于后續(xù)的需求就會(huì)造成不便,我們知道在相機(jī)的回調(diào)中通過此方法獲得的照片是原圖

所以對(duì)于一些諸如頭像設(shè)置之類的不需要圖片質(zhì)量那么大的情況下逝慧,原圖會(huì)造成一些不必要的流量操作昔脯,網(wǎng)絡(luò)不好的話用戶體驗(yàn)也會(huì)受到一定影響。當(dāng)然我們可以在這里就對(duì)圖片進(jìn)行壓縮處理笛臣,但是這種處理方式顯然不是最好的云稚。

? ? 2、在TZImage存儲(chǔ)照片的時(shí)候沈堡,對(duì)存儲(chǔ)的時(shí)間進(jìn)行調(diào)整静陈。

? ? 這種處理方式也很簡(jiǎn)單,而且無需更多的操作诞丽,只是簡(jiǎn)單的修改一下照片的時(shí)間屬性鲸拥。

只需要在這里將[NSDate date]改成一個(gè)相對(duì)靠后的時(shí)間,你不是來自未來的照片嗎僧免,我讓你知道什么是未來刑赶,設(shè)置一個(gè)2100年,什么懂衩?還不夠角撞。那就2200年,總之我就是要我拍攝的照片放在相冊(cè)的第一個(gè)勃痴,怎么說谒所?


皮一下很舒服。好了沛申,言歸正傳劣领,這種處理方式顯然也是有問題的,到時(shí)候因?yàn)橐粋€(gè)APP導(dǎo)致手機(jī)里一堆搞不清楚時(shí)間的照片铁材,就皮不起來了尖淘。

? ? 3奕锌、也是我目前能想到的最好的解決方式。當(dāng)照片存儲(chǔ)完成之后村生,通過照片的localIdentifier獲取到照片的PHAsset(iOS 8之前獲取ALAsset)惊暴,再通過PHAsset/ALAsset,獲取到TZAssetModel(TZImage自己的圖片對(duì)象)趁桃,接著在更新相冊(cè)的方法中辽话,把我們剛才獲取到的Model傳進(jìn)來(推薦block),不再使用TZImage原先的方式取值卫病,把我們自己獲取到的Model存入回調(diào)數(shù)組中油啤,萬事大吉。

? ? 說起來很抽象蟀苛?上代碼:


我將TZImage的savePhotoWithImage:location:completion方法的block進(jìn)行了調(diào)整益咬,新增了一個(gè)返回值TZAssetModel *assetModel。在savePhotoWithImage:location:completion方法中將其獲取并傳遞回來:

- (void)savePhotoWithImage:(UIImage*)image location:(CLLocation*)location completion:(getCurrentPhotos)completion {

? ? __blockTZAssetModel*model =nil;

? ? __blockNSString*idStr =nil;

? ? if (iOS8Later) {

? ? ? ? [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

? ? ? ? ? ? if(iOS9Later) {

? ? ? ? ? ? ? ? NSData*data =UIImageJPEGRepresentation(image,0.9);

? ? ? ? ? ? ? ? PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];

? ? ? ? ? ? ? ? options.shouldMoveFile=YES;

? ? ? ? ? ? ? ? PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];

? ? ? ? ? ? ? ? [requestaddResourceWithType:PHAssetResourceTypePhoto data:data options:options];

? ? ? ? ? ? ? ? if(location) {

? ? ? ? ? ? ? ? ? ? request.location= location;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? request.creationDate= [NSDatedate];

? ? ? ? ? ? ? ? idStr = request.placeholderForCreatedAsset.localIdentifier;

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? PHAssetChangeRequest *request = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

? ? ? ? ? ? ? ? if(location) {

? ? ? ? ? ? ? ? ? ? request.location= location;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? request.creationDate= [NSDatedate];

? ? ? ? ? ? ? ? idStr = request.placeholderForCreatedAsset.localIdentifier;

? ? ? ? ? ? }

? ? ? ? }completionHandler:^(BOOLsuccess,NSError*error) {

? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

? ? ? ? ? ? ? ? if(success && completion) {

? ? ? ? ? ? ? ? ? ? PHFetchResult *result = [PHAsset fetchAssetsWithLocalIdentifiers:@[idStr] options:nil];

? ? ? ? ? ? ? ? ? ? if(result) {

? ? ? ? ? ? ? ? ? ? ? ? PHAsset*asset = [resultlastObject];

? ? ? ? ? ? ? ? ? ? ? ? model = [TZAssetModel modelWithAsset:asset type:TZAssetModelMediaTypePhoto];

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? completion(model,nil);

? ? ? ? ? ? ? ? }elseif(error) {

? ? ? ? ? ? ? ? ? ? NSLog(@"保存照片出錯(cuò):%@",error.localizedDescription);

? ? ? ? ? ? ? ? ? ? if(completion) {

? ? ? ? ? ? ? ? ? ? ? ? completion(model, error);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }];

? ? }else{

? ? ? ? [self.assetLibrary writeImageToSavedPhotosAlbum:image.CGImage orientation:[self orientationFromImage:image] completionBlock:^(NSURL *assetURL, NSError *error) {

? ? ? ? ? ? if(error) {

? ? ? ? ? ? ? ? NSLog(@"保存圖片失敗:%@",error.localizedDescription);

? ? ? ? ? ? ? ? if(completion) {

? ? ? ? ? ? ? ? ? ? completion(model, error);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? // 多給系統(tǒng)0.5秒的時(shí)間帜平,讓系統(tǒng)去更新相冊(cè)數(shù)據(jù)

? ? ? ? ? ? ? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

? ? ? ? ? ? ? ? ? ? if(completion) {

? ? ? ? ? ? ? ? ? ? ? ? [self.assetLibraryassetForURL:assetURLresultBlock:^(ALAsset*asset) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? model = [TZAssetModel modelWithAsset:assetURL type:TZAssetModelMediaTypePhoto];

? ? ? ? ? ? ? ? ? ? ? ? ? ? completion(model,nil);

? ? ? ? ? ? ? ? ? ? ? ? }failureBlock:^(NSError*error) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? completion(model,nil);

? ? ? ? ? ? ? ? ? ? ? ? }];

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? });

? ? ? ? ? ? }

? ? ? ? }];

? ? }

}

最后幽告,修改排序的方法:

- (void)reloadPhotoArray:(TZAssetModel*)currentAssetModel {

? ? TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;

? ? [[TZImageManager manager] getCameraRollAlbum:tzImagePickerVc.allowPickingVideo allowPickingImage:tzImagePickerVc.allowPickingImage needFetchAssets:NO completion:^(TZAlbumModel *model) {

? ? ? ? _model= model;

? ? ? ? [[TZImageManager manager] getAssetsFromFetchResult:_model.result completion:^(NSArray *models) {

? ? ? ? ? ? [tzImagePickerVchideProgressHUD];


? ? ? ? ? ? TZAssetModel*assetModel = currentAssetModel;

? ? ? ? ? ? if(tzImagePickerVc.sortAscendingByModificationDate) {

//? ? ? ? ? ? ? ? assetModel = [models lastObject];

? ? ? ? ? ? ? ? [_modelsaddObject:assetModel];

? ? ? ? ? ? }else{

//? ? ? ? ? ? ? ? assetModel = [models firstObject];

? ? ? ? ? ? ? ? [_modelsinsertObject:assetModelatIndex:0];

? ? ? ? ? ? }


? ? ? ? ? ? if(tzImagePickerVc.maxImagesCount<=1) {

? ? ? ? ? ? ? ? if(tzImagePickerVc.allowCrop) {

? ? ? ? ? ? ? ? ? ? TZPhotoPreviewController *photoPreviewVc = [[TZPhotoPreviewController alloc] init];

//? ? ? ? ? ? ? ? ? ? if (tzImagePickerVc.sortAscendingByModificationDate) {

//? ? ? ? ? ? ? ? ? ? ? ? photoPreviewVc.currentIndex = _models.count - 1;

//? ? ? ? ? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? ? ? ? ? photoPreviewVc.currentIndex = 0;

//? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? photoPreviewVc.currentIndex= [_modelsindexOfObject:assetModel];

? ? ? ? ? ? ? ? ? ? photoPreviewVc.models=_models;

? ? ? ? ? ? ? ? ? ? [selfpushPhotoPrevireViewController:photoPreviewVc];

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? [tzImagePickerVc.selectedModelsaddObject:assetModel];

? ? ? ? ? ? ? ? ? ? [selfdoneButtonClick];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }


? ? ? ? ? ? if(tzImagePickerVc.selectedModels.count< tzImagePickerVc.maxImagesCount) {

? ? ? ? ? ? ? ? assetModel.isSelected=YES;

? ? ? ? ? ? ? ? [tzImagePickerVc.selectedModelsaddObject:assetModel];

? ? ? ? ? ? ? ? [self refreshBottomToolBarStatus];

? ? ? ? ? ? }

? ? ? ? ? ? _collectionView.hidden=YES;

? ? ? ? ? ? [_collectionViewreloadData];


? ? ? ? ? ? _shouldScrollToBottom = YES;

? ? ? ? ? ? [self scrollCollectionViewToBottom];

? ? ? ? }];

? ? }];

}

原諒我把注釋掉的代碼也貼上來了,主要是方便以后我查看自己修改的部分裆甩。

PS:第一次寫簡(jiǎn)書冗锁。而且技術(shù)有限,只能分享一下自己解決問題的思路和最后的成果淑掌。大佬們?nèi)舭l(fā)現(xiàn)什么問題蒿讥,請(qǐng)多多指正蝶念,我需要你們的鞭策抛腕。鞭。媒殉。担敌。。策(哪里怪怪的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廷蓉,一起剝皮案震驚了整個(gè)濱河市全封,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桃犬,老刑警劉巖刹悴,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異攒暇,居然都是意外死亡土匀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門形用,熙熙樓的掌柜王于貴愁眉苦臉地迎上來就轧,“玉大人证杭,你說我怎么就攤上這事《视” “怎么了解愤?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乎莉。 經(jīng)常有香客問我送讲,道長(zhǎng),這世上最難降的妖魔是什么梦鉴? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任李茫,我火速辦了婚禮,結(jié)果婚禮上肥橙,老公的妹妹穿的比我還像新娘魄宏。我一直安慰自己,他們只是感情好存筏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布宠互。 她就那樣靜靜地躺著,像睡著了一般椭坚。 火紅的嫁衣襯著肌膚如雪予跌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天善茎,我揣著相機(jī)與錄音券册,去河邊找鬼。 笑死垂涯,一個(gè)胖子當(dāng)著我的面吹牛烁焙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耕赘,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼骄蝇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了操骡?” 一聲冷哼從身側(cè)響起九火,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎册招,沒想到半個(gè)月后岔激,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是掰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年虑鼎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀惭。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡震叙,死狀恐怖掀鹅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媒楼,我是刑警寧澤乐尊,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站划址,受9級(jí)特大地震影響扔嵌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夺颤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一痢缎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧世澜,春花似錦独旷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至封恰,卻和暖如春麻养,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诺舔。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工鳖昌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人低飒。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓许昨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逸嘀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子车要,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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