2015-01-09 31 views
3

我有問題像蘋果iphone一樣明智地獲取照片在ios8中。我已經實現了使用PHAsset和Photos.framework的ios8。現在,當我在ios7設備上運行相同的代碼時,它不會返回任何內容。所以,我用ALAssetLibrary去獲取照片。使用ALAssetLibrary我也得到了所有的照片,但是這就像專輯明智的照片。也使用這個ALAssetLibrary我不能得到專輯的創建日期而不是它的位置名稱,因爲我必須在每個部分的標題上顯示數據。如何在ios7中使用ALAssetLibrary獲得所有照片?

我對獲取使用ALAssetLibrary在ios​​7照片代碼:

 _imagearray = [@[] mutableCopy]; 
     __block NSMutableArray *tmpAssets = [@[] mutableCopy]; 

     ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; 
     [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
     { 
      if (group) 
      { 
       [group setAssetsFilter:[ALAssetsFilter allAssets]]; 
       [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { 
        if (asset!=nil) 
        { 
         [tmpAssets addObject:asset]; 

        } 
       }]; 
      } 
      self.imagearray = tmpAssets; 
      NSLog (@「%@「,self.imagearray); 
     } 
            failureBlock:^(NSError *error) 
     { 
      NSLog(@"error enumerating AssetLibrary groups %@\n", error); 
     }]; 

回答

1

我發現自己的解決方案。

+ (ALAssetsLibrary *)defaultAssetsLibrary { 
    static dispatch_once_t pred = 0; 
    static ALAssetsLibrary *library = nil; 
    dispatch_once(&pred, ^{ 
     library = [[ALAssetsLibrary alloc] init]; 
    }); 
    return library; 
} 

-(void)loadAssets{ 
    NSMutableArray *unSortArray = [[NSMutableArray alloc] init]; 
    ALAssetsLibrary *library = [MomentsVCTR defaultAssetsLibrary]; 
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
     if (group == nil) { 
      NSLog(@"Done!"); 
      [self manageLocalAssets:unSortArray]; 
     } 
     [group setAssetsFilter:[ALAssetsFilter allAssets]]; 
     [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) { 
      if (alAsset) { 
       [unSortArray addObject:alAsset]; 
      } 

     }]; 
    } failureBlock: ^(NSError *error) { 
     NSLog(@"No groups: %@",error); 
    }]; 
} 

-(void)manageLocalAssets:(NSMutableArray*)unSortArray{ 
    NSMutableArray *_resultArray = [[NSMutableArray alloc] init]; 
    NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
    [df setDateFormat:@"dd-MMM-yyyy"]; 
    NSLog(@"in loadassets"); 
    NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
    NSArray *descriptors=[NSArray arrayWithObject: descriptor]; 
    NSArray *reverseOrder=[unSortArray sortedArrayUsingDescriptors:descriptors]; 

    for (int k=0; k<reverseOrder.count; k++) { 
     ALAsset *asset = (ALAsset *)[reverseOrder objectAtIndex:k]; 
     NSString *dateStr = [df stringFromDate:[asset valueForProperty:ALAssetPropertyDate]]; 
     if (![self.arrDate containsObject:dateStr]) { 
      [self.arrDate addObject:dateStr]; 
      [self.arrEventID addObject:@"0"]; 
      [self.arrEventName addObject:@"0"]; 
     } 
     [_resultArray addObject:asset]; 
    } 
    for (int i=0;i<self.arrDate.count;i++) { 
     NSMutableArray *arr = [[NSMutableArray alloc] init]; 
     NSMutableArray *arr2 = [[NSMutableArray alloc] init]; 
     int tPhoto = 0; 
     int tVideo = 0; 
     for (int j=0; j<_resultArray.count; j++) { 
      ALAsset *asset = (ALAsset*)[_resultArray objectAtIndex:j]; 
      NSString *dateStr = [df stringFromDate:[asset valueForProperty:ALAssetPropertyDate]]; 
      if ([[self.arrDate objectAtIndex:i] isEqualToString:dateStr]) { 
       UIImage *latestPhotoThumbnail = [UIImage imageWithCGImage:[asset thumbnail]]; 
       [arr addObject:latestPhotoThumbnail]; 
       latestPhotoThumbnail = nil; 
       if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) { 
        [arr2 addObject:@"1"]; 
        tVideo++; 
       } 
       else{ 
        [arr2 addObject:@"0"]; 
        tPhoto++; 
       } 
       NSDate *date = [asset valueForProperty:ALAssetPropertyDate]; 
       NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
       [dateFormatter setLocale:[NSLocale currentLocale]]; 
       [dateFormatter setDateFormat:@"dd-MMM-yyyy"]; 
       [self.imageDateArray addObject:[dateFormatter stringFromDate:date]]; 
       [self.imageIdArray addObject:[NSString stringWithFormat:@"%d",i]]; 
      } 
     } 
     [self.imagearray addObject:arr]; 
     [self.arrContentType addObject:arr2]; 

     [self.momentArray addObject:[NSString stringWithFormat:@"%lu",(unsigned long)arr.count]]; 
     [self.arrPhotoCount addObject:[NSString stringWithFormat:@"%d",tPhoto]]; 
     [self.arrVideoCount addObject:[NSString stringWithFormat:@"%d",tVideo]]; 
    } 
    [self setButtonsSize]; 
    self.collection.dataSource = self; 
    self.collection.delegate = self; 
    [self.collection reloadData]; 
    [self.collection.collectionViewLayout invalidateLayout]; 
    self.footerView.hidden = TRUE; 
    self.footerWebView.hidden = TRUE; 

} 
1

你的運氣了與iOS 7 AssetsLibrary因爲你只看到收益相冊(Camera Roll中,用戶相冊)。儘管iOS 7中的Photos App顯示Moments,但iOS 7中沒有開發者API來獲取Moments。

+0

是的,這是真的,我也在iOS8中管理這個,但iOS 7我還沒有找到任何解決方案。 –

+0

您可以做的唯一一件事:自己掃描整個照片庫,然後創建一個像結構的時刻(無論是在內存中,還是在數據結構/磁盤上的數據庫中)。但是,如果用戶有很多照片,這會很慢。此外,您需要每次重新掃描整個庫,因爲AssetsLibrary在應用程序未運行時沒有方法查明哪些資產已被添加或刪除。 – holtmann

相關問題