2014-10-12 2 views
3

Есть ли способ получить только сегодняшние фотографии из альбома в ios? Я знаю, как получить альбом, но все фотографии отображаются как временные рамки. Я хочу получить только сегодняшние фотографии или фото последние два дня, как я могу это понять? Спасибо.Получить сегодняшнее фото с альбома в IOS

+0

сделать это с помощью AssetLibrary framework: http://stackoverflow.com/questions/18575691/filter-alassets-by-year –

ответ

5

Вы можете использовать этот фрагмент, чтобы получить сегодняшнюю фотографию, которая работает на iOS 8. Я изначально отфильтровал активы из недавно добавленного альбома, в котором хранятся фотографии за последние 30 дней или 1000 фотографий. Есть шанс, что пользователь запечатлел более 1000 фотографий за два дня, поэтому я изменил код, чтобы получить все фотографии из библиотеки.

PHFetchOptions *options = [[PHFetchOptions alloc] init]; 
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; 
options.predicate = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeImage]; 

PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsWithOptions:options]; 

//get day component of today 
NSCalendar* calendar = [NSCalendar currentCalendar]; 
NSDateComponents *dayComponent = [calendar components:NSCalendarUnitDay fromDate:[NSDate date]]; 
NSInteger currentDay = dayComponent.day; 

//get day component of yesterday 
dayComponent.day = - 1; 
NSDate *yesterdayDate = [calendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0]; 
NSInteger yesterDay = [[calendar components:NSCalendarUnitDay fromDate:yesterdayDate] day]; 

//filter assets of today and yesterday add them to an array. 
NSMutableArray *assetsArray = [NSMutableArray array]; 
for (PHAsset *asset in assetsFetchResult) { 
    NSInteger assetDay = [[calendar components:NSCalendarUnitDay fromDate:asset.creationDate] day]; 

    if (assetDay == currentDay || assetDay == yesterDay) { 
     [assetsArray addObject:asset]; 
    } 
    else { 
     //assets is in descending order, so we can break here. 
     break; 
    } 
} 

До IOS 8, используя ALAssetsLibrary, предположим, что у вас есть фото группы, перечислить группу в обратном порядке, и сделать нечто подобное, как описано выше.

[self.photoGroup enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { 
     NSDate *date = [asset valueForProperty:ALAssetPropertyDate]; 
    }]; 
+0

не просто запишите код здесь. по крайней мере, добавить короткое предложение, объясняющее, ПОЧЕМУ он делает то, что он делает. - Также упоминаем, что это только для ios8 –

+0

@ Daij-Djan, вы правы, спасибо, что сообщили мне. – gabbler

+0

cool - revesered мой голос –

2

Вы можете использовать предикат для дня

PHFetchOptions *allPhotosOptions = [PHFetchOptions new]; 
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; 

NSPredicate *predicateMediaType = [NSPredicate predicateWithFormat:@"mediaType = %d",PHAssetMediaTypeImage]; 
NSDate *date = [[NSDate date] beginningOfDay]; 
NSPredicate *predicateDate = [NSPredicate predicateWithFormat:@"creationDate >= %@", date]; 

NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicateDate, predicateMediaType]]; 


allPhotosOptions.predicate = compoundPredicate; 

PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:allPhotosOptions]; 

Где

@implementation NSDate (Utils) 

- (NSDate *)beginningOfDay { 
NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [calendar components:CYCalendarUnitYear | CYCalendarUnitMonth | CYCalendarUnitDay fromDate:self]; 

    return [calendar dateFromComponents:components]; 
} 
+0

Это на самом деле гораздо лучший ответ, чем принятый. Это не нужно извлекать все изображения, а затем отфильтровывать их. и только с одной строкой кода. :) –

7

Swift 3 версии с диапазоном дат:

let fromDate = // the date after which you want to retrieve the photos 
let toDate // the date until which you want to retrieve the photos 

let options = PHFetchOptions() 
options.predicate = NSPredicate(format: "creationDate > %@ && creationDate < %@", fromDate as CVarArg, toDate as CVarArg) 

//Just a way to set order 
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false) 
options.sortDescriptors = [sortDescriptor] 

return PHAsset.fetchAssets(with: .image, options: options) 
+0

У вас есть опечатка во втором типе аргументов. –

+0

Спасибо. Это продолжалось долго. :) –

+0

Вы просто меняете это неправильно. «CVarArg» был правильным, просто во втором параметре у вас был «CVarGArg». Извините за недопонимание ;) –

Смежные вопросы