iOS 8 Foto di quadro: Ottenere un elenco di tutti gli album con iOS8

Come posso ottenere un elenco di tutte le collezioni, tra cui il rullino (che ora si chiama momenti), in iOS8?

In iOS 7, io uso ALAssetGroup enumerazione di blocco, ma che non include iOS momenti che sembra essere equivalente a rullino in iOS7.

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
    {
        if (group == nil) {//We're done enumerating
            return;
        }

        [group setAssetsFilter:[ALAssetsFilter allAssets]];
        if ([[sGroupPropertyName lowercaseString] isEqualToString:@"camera roll"] && nType == ALAssetsGroupSavedPhotos) {
            [_assetGroups insertObject:group atIndex:0];
        } else {
            [_assetGroups addObject:group];
        }
    };

    //Group Enumerator Failure Block
    void (^assetGroupEnumberatorFailure)(NSError *) = ^(NSError *error) {
        SMELog(@"Enumeration occured %@", [error description]);
    };

    //Enumerate Albums
    [_library enumerateGroupsWithTypes:kSupportedALAlbumsMask
                            usingBlock:assetGroupEnumerator
                          failureBlock:assetGroupEnumberatorFailure];
    }];
InformationsquelleAutor kev | 2014-09-22



3 Replies
  1. 122

    Utilizzando le Foto Quadro è un po ‘ diverso, è possibile ottenere lo stesso risultato, anche se, devi solo fare in alcune parti.

    1) Ottenere tutte le foto (i Momenti in iOS8, o rullino prima)

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

    Facoltativamente, se si desidera ordinare per data di creazione, è sufficiente aggiungere PHFetchOptions in questo modo:

    PHFetchOptions *allPhotosOptions = [PHFetchOptions new];
    allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
    
    PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:allPhotosOptions];
    

    Ora, se si vuole, si può ottenere risorse da PHFetchResult oggetto:

    [allPhotosResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
        NSLog(@"asset %@", asset);
    }];
    

    2) Ottenere tutti utente album (con ordinamento aggiuntivo per esempio, per visualizzare solo gli album con almeno una foto)

    PHFetchOptions *userAlbumsOptions = [PHFetchOptions new];
    userAlbumsOptions.predicate = [NSPredicate predicateWithFormat:@"estimatedAssetCount > 0"];
    
    PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:userAlbumsOptions];
    
    [userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {
            NSLog(@"album title %@", collection.localizedTitle);
    }];
    

    Per ogni PHAssetCollection che è tornato da PHFetchResult *userAlbums è possibile recuperare PHAssets come modo (si può anche limitare i risultati per includere solo le foto di attività):

    PHFetchOptions *onlyImagesOptions = [PHFetchOptions new];
    onlyImagesOptions.predicate = [NSPredicate predicateWithFormat:@"mediaType = %i", PHAssetMediaTypeImage];
    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:onlyImagesOptions];
    

    3) Get smart album

    PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    [smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {
            NSLog(@"album title %@", collection.localizedTitle);
    }];
    

    Una cosa da notare con Smart Album collection.estimatedAssetCount può tornare NSNotFound se estimatedAssetCount non può essere determinato. Come il titolo suggerisce, questo è stimato. Se vuoi essere sicuro del numero di attività è necessario eseguire il fetch e ottenere il numero come:

    PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    

    numero di attività = assetsFetchResult.count

    Apple ha un progetto di esempio che fa quello che vuoi:

    https://developer.apple.com/library/content/samplecode/UsingPhotosFramework/ExampleappusingPhotosframework.zip (devi essere uno sviluppatore registrato per accedere a questo)

    • Ehi @Ladislav, grande risposta. Ma come hai fatto a sapere per utilizzare creationDate per il sortDescriptor, sono le foto attributi documentato?
    • C’è una bella documentazione da Apple su questo – developer.apple.com/library/prerelease/ios/documentation/Photos/… guarda sortDescriptors e vedrete: “Costruire sorta descrittori con le proprietà della foto entità che si desidera recuperare, elencate in Tabella 1. Per esempio, il codice seguente ordina per data di creazione per scoprire la più antica attività della libreria di foto.” Tabella 1 ha tutte le proprietà che è possibile utilizzare per PHAsset, PHAssetCollection, PHCollectionList, PHCollection…
    • Grazie. Esattamente quello che stavo cercando!
    • Grazie per l’ottima risposta. Non capisco però perché avete bisogno di andare a prendere “Tutte le Foto”. Mi rendo conto che fa questo esempio app, ma se si scarica la smart album e album, non copre tutte le foto?
    • la risposta è ancora più chiaro che il documento di Apple !!! Grazie!!!
    • Ho provato a mettere tutte le foto, ma non includono le foto in un istante (che comprendono solo il rullino). Non sono sicuro si ha a che fare con iOS 9. Ho provato anche Apple codice di esempio, e mentre dicono che comprende momenti, non è così.
    • mi spieghi la differenza tra Momenti e quello che voi chiamate il rullino?
    • Sto usando iOS 9, e nei miei Momenti, include le foto che ho sincronizzato con iTunes (app Foto). Momenti include tutto, mentre a rullino include solo le foto che ha preso e non ancora importati e la loro cancellazione.
    • prova a giocare con il numero 3) Get Smart Album cambiando sottotipo: Controllare enum opzioni per PHAssetCollectionSubtype: developer.apple.com/library/ios/documentation/Photos/Reference/…
    • Ho provato, e non funziona. Il codice riportato di seguito da stackoverflow.com/a/25996662/242682 funziona, anche se è un po ‘ di forza bruta, l’iterazione di tutti i beni.
    • Non riesce se estimatedAssetCount == NSNotFound

  2. 17

    Questa è semplicemente una traduzione di @Ladislav superba accettato di rispondere in Swift:

    //*** 1 ***
    //Get all photos (Moments in iOS8, or Camera Roll before)
    //Optionally if you want them ordered as by creation date, you just add PHFetchOptions like so:
    let allPhotosOptions = PHFetchOptions()
    allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
    
    let allPhotosResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: allPhotosOptions)
    
    //Now if you want you can get assets from the PHFetchResult object:
    allPhotosResult.enumerateObjectsUsingBlock({ print("Asset \($0.0)") })
    
    //*** 2 ***
    //Get all user albums (with additional sort for example to only show albums with at least one photo)
    let userAlbumsOptions = PHFetchOptions()
    userAlbumsOptions.predicate = NSPredicate(format: "estimatedAssetCount > 0")
    
    let userAlbums = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: userAlbumsOptions)
    
    userAlbums.enumerateObjectsUsingBlock( {
        if let collection = $0.0 as? PHAssetCollection {
            print("album title: \(collection.localizedTitle)")
            //For each PHAssetCollection that is returned from userAlbums: PHFetchResult you can fetch PHAssets like so (you can even limit results to include only photo assets):
            let onlyImagesOptions = PHFetchOptions()
            onlyImagesOptions.predicate = NSPredicate(format: "mediaType = %i", PHAssetMediaType.Image.rawValue)
            if let result = PHAsset.fetchKeyAssetsInAssetCollection(collection, options: onlyImagesOptions) {
                print("Images count: \(result.count)")
            }
        }
    } )
    
    //*** 3 ***
    //Get smart albums
    
    let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .AlbumRegular, options: nil) //Here you can specify Photostream, etc. as PHAssetCollectionSubtype.xxx
    smartAlbums.enumerateObjectsUsingBlock( {
        if let assetCollection = $0.0 as? PHAssetCollection {
            print("album title: \(assetCollection.localizedTitle)")
            //One thing to note with Smart Albums is that collection.estimatedAssetCount can return NSNotFound if estimatedAssetCount cannot be determined. As title suggest this is estimated. If you want to be sure of number of assets you have to perform fetch and get the count like:
    
            let assetsFetchResult = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: nil)
            let numberOfAssets = assetsFetchResult.count
            let estimatedCount =  (assetCollection.estimatedAssetCount == NSNotFound) ? -1 : assetCollection.estimatedAssetCount
            print("Assets count: \(numberOfAssets), estimate: \(estimatedCount)")
        }
    } )
    
    • Grazie mille!
    • Ciao @Grimxn, posso sapere, Come recuperare gli Ultimi importare le foto nella libreria Foto. Basata sulla creazione data anche l’ordinamento ci sono sempre tutte le immagini. Ma la mia esigenza è solo recuperare l’ultima foto importate. perché, Abbiamo usato esterni fotocamera e scattare la foto e copia di IPAD. Così, Come recuperare l’Ultima “Importa foto” in app fine?
    • Non sto lavorando su questo, al momento, ma credo che è necessario enumerare gli asset collezioni https://developer.apple.com/documentation/photos/phassetcollection#1656287 e controllare la loro assetCollectionTypes…
  3. 1

    Provare questo Codice…

    auto.imageArray=[[NSArray alloc] init];

    PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
    requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
    requestOptions.synchronous = true;
    PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
    
    NSLog(@"%d",(int)result.count);
    
        PHImageManager *manager = [PHImageManager defaultManager];
        NSMutableArray *images = [NSMutableArray arrayWithCapacity:countValue];
    
        //assets contains PHAsset objects.
    
        __block UIImage *ima;
        for (PHAsset *asset in result) {
            //Do something with the asset
    
            [manager requestImageForAsset:asset
                               targetSize:PHImageManagerMaximumSize
                              contentMode:PHImageContentModeDefault
                                  options:requestOptions
                            resultHandler:^void(UIImage *image, NSDictionary *info) {
                                ima = image;
    
                                [images addObject:ima];
    
                            }];
    
    
    
    
        self.imageArray = [images copy];
    

Lascia un commento