PhotoKit in Xamarin.iOS
Herunterladen eines Codebeispiels
PhotoKit ist ein Framework, mit dem Anwendungen die Systemimagebibliothek abfragen und benutzerdefinierte Benutzeroberflächen erstellen können, um den Inhalt anzuzeigen und zu ändern. Es enthält eine Reihe von Klassen, die Bild- und Videoressourcen sowie Sammlungen von Ressourcen wie Alben und Ordnern darstellen.
Berechtigungen
Bevor Ihre App auf die Fotobibliothek zugreifen kann, wird dem Benutzer ein Berechtigungsdialogfeld angezeigt. Sie müssen erklärenden Text in der Datei Info.plist angeben, um zu erläutern, wie Ihre App die Fotobibliothek verwendet, z. B.:
<key>NSPhotoLibraryUsageDescription</key>
<string>Applies filters to photos and updates the original image</string>
Modellobjekte
PhotoKit stellt diese Ressourcen in den so genannten Modellobjekten dar. Die Modellobjekte, die die Fotos und Videos selbst darstellen, sind vom Typ PHAsset
. Ein PHAsset
enthält Metadaten wie den Medientyp und das Erstellungsdatum des Medienobjekts.
Entsprechend enthalten die PHAssetCollection
Klassen und PHCollectionList
Metadaten zu Ressourcensammlungen bzw. Auflistungslisten. Objektsammlungen sind Gruppen von Ressourcen, z. B. alle Fotos und Videos für ein bestimmtes Jahr. Ebenso sind Sammlungslisten Gruppen von Objektsammlungen, z. B. Fotos und Videos nach Jahr gruppiert.
Abfragen von Modelldaten
PhotoKit erleichtert das Abfragen von Modelldaten über eine Vielzahl von Abrufmethoden. Wenn Sie beispielsweise alle Bilder abrufen möchten, rufen PHAsset.Fetch
Sie auf , und übergeben Sie den PHAssetMediaType.Image
Medientyp.
PHFetchResult fetchResults = PHAsset.FetchAssets (PHAssetMediaType.Image, null);
Die PHFetchResult
instance enthält dann alle Instanzen, die PHAsset
Images darstellen. Um die Images selbst abzurufen, verwenden Sie die PHImageManager
(oder die Zwischenspeicherungsversion), um eine Anforderung für das Image zu stellen, PHCachingImageManager
indem Sie aufrufen RequestImageForAsset
. Der folgende Code ruft beispielsweise ein Bild für jedes Objekt in einem PHFetchResult
ab, das in einer Sammlungsansichtszelle angezeigt wird:
public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);
imageMgr.RequestImageForAsset (
(PHAsset)fetchResults [(uint)indexPath.Item],
thumbnailSize,
PHImageContentMode.AspectFill, new PHImageRequestOptions (),
(img, info) => {
imageCell.ImageView.Image = img;
}
);
return imageCell;
}
Dies führt zu einem Raster von Bildern, wie unten gezeigt:
Speichern von Änderungen in der Fotobibliothek
So wird das Abfragen und Lesen von Daten behandelt. Sie können Änderungen auch zurück in die Bibliothek schreiben. Da mehrere interessierte Anwendungen mit der Systemfotobibliothek interagieren können, können Sie einen Beobachter registrieren, um über Änderungen informiert PhotoLibraryObserver
zu werden. Wenn Dann Änderungen eintreffen, kann Ihre Anwendung entsprechend aktualisiert werden. Hier sehen Sie beispielsweise eine einfache Implementierung, um die Sammlungsansicht oben neu zu laden:
class PhotoLibraryObserver : PHPhotoLibraryChangeObserver
{
readonly PhotosViewController controller;
public PhotoLibraryObserver (PhotosViewController controller)
{
this.controller = controller;
}
public override void PhotoLibraryDidChange (PHChange changeInstance)
{
DispatchQueue.MainQueue.DispatchAsync (() => {
var changes = changeInstance.GetFetchResultChangeDetails (controller.fetchResults);
controller.fetchResults = changes.FetchResultAfterChanges;
controller.CollectionView.ReloadData ();
});
}
}
Um Änderungen tatsächlich aus Ihrer Anwendung zurückzuschreiben, erstellen Sie eine Änderungsanforderung. Jede Modellklasse verfügt über eine zugeordnete Änderungsanforderungsklasse. Um z. B. einen PHAsset
zu ändern, erstellen Sie ein PHAssetChangeRequest
. Die Schritte zum Ausführen von Änderungen, die zurück in die Fotobibliothek geschrieben und wie oben an Beobachter gesendet werden, sind:
- Führen Sie den Bearbeitungsvorgang aus.
- Speichern Sie die gefilterten Bilddaten in einem
PHContentEditingOutput
instance. - Stellen Sie eine Änderungsanforderung, um die Änderungen aus der Bearbeitungsausgabe zu veröffentlichen.
Im Folgenden sehen Sie ein Beispiel, in dem eine Änderung auf ein Bild zurückgeschrieben wird, das einen Core Image Noir-Filter anwendet:
void ApplyNoirFilter (object sender, EventArgs e)
{
Asset.RequestContentEditingInput (new PHContentEditingInputRequestOptions (), (input, options) => {
// perform the editing operation, which applies a noir filter in this case
var image = CIImage.FromUrl (input.FullSizeImageUrl);
image = image.CreateWithOrientation((CIImageOrientation)input.FullSizeImageOrientation);
var noir = new CIPhotoEffectNoir {
Image = image
};
var ciContext = CIContext.FromOptions (null);
var output = noir.OutputImage;
var uiImage = UIImage.FromImage (ciContext.CreateCGImage (output, output.Extent));
imageView.Image = uiImage;
//
// save the filtered image data to a PHContentEditingOutput instance
var editingOutput = new PHContentEditingOutput(input);
var adjustmentData = new PHAdjustmentData();
var data = uiImage.AsJPEG();
NSError error;
data.Save(editingOutput.RenderedContentUrl, false, out error);
editingOutput.AdjustmentData = adjustmentData;
//
// make a change request to publish the changes form the editing output
PHPhotoLibrary.GetSharedPhotoLibrary.PerformChanges (() => {
PHAssetChangeRequest request = PHAssetChangeRequest.ChangeRequest(Asset);
request.ContentEditingOutput = editingOutput;
},
(ok, err) => Console.WriteLine ("photo updated successfully: {0}", ok));
});
}
Wenn der Benutzer die Schaltfläche auswählt, wird der Filter angewendet:
Und dank wird die PHPhotoLibraryChangeObserver
Änderung in der Sammlungsansicht widerspiegelt, wenn der Benutzer zurück navigiert: