2012-08-28 10 views

Odpowiedz

15

Można utworzyć własny album i dodać zdjęcie dość łatwo z tych linii kodu w iOS:

// Create the new album. 
__block PHObjectPlaceholder *myAlbum; 
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
    PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title]; 
    myAlbum = changeRequest.placeholderForCreatedAssetCollection; 
} completionHandler:^(BOOL success, NSError *error) { 
    if (success) { 
     PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[myAlbum.localIdentifier] options:nil]; 
     PHAssetCollection *assetCollection = fetchResult.firstObject; 

     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
      PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

      // add asset 
      PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; 
      [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; 
     } completionHandler:^(BOOL success, NSError *error) { 
      if (!success) { 
       NSLog(@"Error: %@", error); 
      } 
     }]; 
    } else { 
     NSLog(@"Error: %@", error); 
    } 
}]; 
+3

Opisują tylko, jak ustawić niestandardową nazwę albumu, co z niestandardową nazwą obrazu? –

+1

Dobra robota ... :) – sohil

+0

Czy ktoś może mi pomóc w wersji Swift 3? – Priyal

7

ona pracowała z iOS od 5.0.
Proszę importować AssetsLibrary/AssetsLibrary.h

ALAssetsLibrary* libraryFolder = [[ALAssetsLibrary alloc] init]; 
[libraryFolder addAssetsGroupAlbumWithName:@"My Album" resultBlock:^(ALAssetsGroup *group) 
{ 
    NSLog(@"Adding Folder:'My Album', success: %s", group.editable ? "Success" : "Already created: Not Success"); 
} failureBlock:^(NSError *error) 
{ 
    NSLog(@"Error: Adding on Folder"); 
}]; 
-2

Można spróbować My niżej metoda dla Utwórz album dla iOS 7 i iOS 8

#define PHOTO_ALBUM_NAME @"AlbumName Videos" 
-(void)createAlbum{ 

// PHPhotoLibrary_class will only be non-nil on iOS 8.x.x 
Class PHPhotoLibrary_class = NSClassFromString(@"PHPhotoLibrary"); 

if (PHPhotoLibrary_class) { 


    // iOS 8..x. . code that has to be called dynamically at runtime and will not link on iOS 7.x.x ... 

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
     [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:PHOTO_ALBUM_NAME]; 
    } completionHandler:^(BOOL success, NSError *error) { 
     if (!success) { 
      NSLog(@"Error creating album: %@", error); 
     }else{ 
      NSLog(@"Created"); 
     } 
    }]; 
}else{ 
    [self.library addAssetsGroupAlbumWithName:PHOTO_ALBUM_NAME resultBlock:^(ALAssetsGroup *group) { 
     NSLog(@"adding album:'Compressed Videos', success: %s", group.editable ? "YES" : "NO"); 

     if (group.editable == NO) { 
     } 

    } failureBlock:^(NSError *error) { 
     NSLog(@"error adding album"); 
    }]; 
}} 
9

Ponieważ AssetsLibrary jest przestarzałe, użyj Photos framework (system iOS 8 i nowsze wersje).

// Deprecated! 
import AssetsLibrary 

// Swift 3.0 
let assetsLibrary = ALAssetsLibrary() 
assetsLibrary.addAssetsGroupAlbum(withName: "NewAlbum", resultBlock: { assetsGroup in 
    print(assetsGroup == nil ? "Already created" : "Success") 
}, failureBlock: { error in 
    print(error) 
}) 

Można użyć udostępnionego PHPhotoLibrary obiekt do tworzenia nowych zdjęć, ale nie można dać im konkretne nazwy, ponieważ będziesz pracował z aktywów, które muszą być zarządzane przez Photos.app. Każdy zasób ma określone właściwości. Możesz pobierać obiekty, żądać zmian, ładować zasoby/miniaturki i buforować itd.

Aby utworzyć niestandardowy album, użyj numeru PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:).

Krótki przykład:

// Swift 3.0 
func createPhotoLibraryAlbum(name: String) { 
    var albumPlaceholder: PHObjectPlaceholder? 
    PHPhotoLibrary.shared().performChanges({ 
     // Request creating an album with parameter name 
     let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: name) 
     // Get a placeholder for the new album 
     albumPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection 
    }, completionHandler: { success, error in 
     if success { 
      guard let placeholder = albumPlaceholder else { 
       fatalError("Album placeholder is nil") 
      } 

      let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil) 
      guard let album: PHAssetCollection = fetchResult.firstObject else { 
       // FetchResult has no PHAssetCollection 
       return 
      } 

      // Saved successfully! 
      print(album.assetCollectionType) 
     } 
     else if let e = error { 
      // Save album failed with error 
     } 
     else { 
      // Save album failed with no error 
     } 
    }) 
} 

Nie zapomnij import Photos bibliotece.

Aby utworzyć nowy zasób zdjęć na tym albumie, należy użyć numeru PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:).

// Swift 3.0 
func createPhotoOnAlbum(photo: UIImage, album: PHAssetCollection) { 
    PHPhotoLibrary.shared().performChanges({ 
     // Request creating an asset from the image 
     let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: photo) 
     // Request editing the album 
     guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album) else { 
      // Album change request has failed 
      return 
     } 
     // Get a placeholder for the new asset and add it to the album editing request 
     guard let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else { 
      // Photo Placeholder is nil 
      return 
     } 
     albumChangeRequest.addAssets([photoPlaceholder] as NSArray) 
    }, completionHandler: { success, error in 
     if success { 
      // Saved successfully! 
     } 
     else if let e = error { 
      // Save photo failed with error 
     } 
     else { 
      // Save photo failed with no error 
     } 
    }) 
} 

UPDATE:

Musimy żądać dostępu, aby móc korzystać z biblioteki zdjęć:

PHPhotoLibrary.requestAuthorization { status in 
    switch status { 
    ... 
} 

Jako iOS 10 a przede musimy także dodać wpis w celu uzyskania dostępu do docelowego pliku .plist dla "Prywatność - opis użycia biblioteki zdjęć":

<key>NSPhotoLibraryUsageDescription</key> 
<string>Access to photos is needed to provide app features</string> 
+0

To daje błąd z Swift 3 w wierszu: "niech strzegą album = fetchResult.firstObject jak PhotoAlbum else { assert (false? "FetchResult ma PHAssetCollection") }" Błąd: Zastosowanie nierejestrowana wpisz PhotoAlbum. Czy możesz zaproponować zmianę? – Priyal

+0

@Priyal spróbuj dodać 'typealias PhotoAlbum = PHAsset'. – ricardopereira

+0

Dzięki! to działało z PHAssetCollection :) – Priyal

Powiązane problemy