2015-01-09 16 views
3

ios8에 사과 사과 같이 현명한 순간에 사진을 가져 오는 데 문제가 있습니다. 나는 PHAsset과 Photos.framework를 사용하여 ios8을 구현했다. 이제 ios7 장치에서 동일한 코드를 실행하면 아무 것도 반환하지 않습니다. 그래서 저는 ALAssetLibrary를 가지고 사진을 얻습니다. ALAssetLibrary 사용하기 나는 또한 모든 사진을 가지고 있지만 그것은 앨범 현명한 사진과 같습니다. 또한이 ALAssetLibrary를 사용하여 앨범의 생성 날짜를 위치 이름이 아닌 가져올 수 없습니다. 이는 각 섹션의 헤더에있는 데이터에이를 표시해야하기 때문입니다. ALAssetLibrary를 사용하여 iOS7에있는 사진을 가져 오는에 대한ios7에서 ALAssetLibrary를 사용하여 모든 사진을 현명하게 얻는 방법은 무엇입니까?

내 코드 :

 _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

만 반환 앨범 (카메라 롤, 사용자 앨범)을 관찰 당신은 아이폰 OS 7 AssetsLibrary와 운이다. iOS 7의 사진 앱에는 순간이 표시되지만 iOS 7에는 개발자 API가 없습니다.

+0

예, 사실입니다. iOS8에서도 관리했지만 iOS 7에서는 해결 방법을 찾지 못했습니다. –

+0

할 수있는 유일한 방법 : 직접 전체 사진 라이브러리를 스캔 한 다음 구조와 같은 순간을 만듭니다 (메모리 또는 디스크의 데이터 구조/데이터베이스에서). 그러나 사용자가 많은 사진을 가지고 있다면 이것은 매우 느릴 것입니다. 또한 AssetsLibrary는 앱이 실행되지 않을 때 추가 또는 삭제 된 애셋을 찾는 방법이 없기 때문에 전체 라이브러리를 다시 검색해야합니다. – holtmann