PhotoKit v Xamarin.iOS

Download Sample Stažení ukázky kódu

PhotoKit je architektura, která aplikacím umožňuje dotazovat se na knihovnu systémových imagí a vytvářet vlastní uživatelská rozhraní pro zobrazení a úpravu jeho obsahu. Zahrnuje řadu tříd, které představují prostředky obrázků a videí, a také kolekce prostředků, jako jsou alba a složky.

Oprávnění

Než bude mít vaše aplikace přístup k knihovně fotek, zobrazí se uživateli dialogové okno oprávnění. Do souboru Info.plist musíte zadat vysvětlující text, abyste vysvětlili, jak vaše aplikace používá knihovnu fotek, například:

<key>NSPhotoLibraryUsageDescription</key>
<string>Applies filters to photos and updates the original image</string>

Objekty modelu

PhotoKit představuje tyto prostředky v tom, co volá objekty modelu. Objekty modelu, které představují fotografie a videa samotné, jsou typu PHAsset. A PHAsset obsahuje metadata, jako je typ média aktiva a datum jejího vytvoření. Podobně třídy PHAssetCollectionPHCollectionList obsahují metadata o kolekcích prostředků a seznamech kolekcí kolekcí. Kolekce prostředků jsou skupiny prostředků, například všechny fotky a videa pro daný rok. Seznamy kolekcí jsou také skupiny kolekcí prostředků, jako jsou fotky a videa seskupené podle roku.

Dotazování dat modelu

PhotoKit usnadňuje dotazování dat modelu pomocí různých metod načítání. Pokud chcete například načíst všechny obrázky, volali PHAsset.Fetchbyste a předali PHAssetMediaType.Image typ média.

PHFetchResult fetchResults = PHAsset.FetchAssets (PHAssetMediaType.Image, null);

Instance PHFetchResult by pak obsahovala všechny PHAsset instance představující obrázky. K získání samotných imagí použijete PHImageManager (nebo verzi PHCachingImageManagerukládání do mezipaměti) k vytvoření požadavku na image voláním RequestImageForAsset. Například následující kód načte obrázek pro každý prostředek v PHFetchResult buňce zobrazení kolekce:

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;
}

Výsledkem je mřížka obrázků, jak je znázorněno níže:

The running app displaying a grid of images

Uložení změn do knihovny fotek

To je postup, jak zpracovávat dotazování a čtení dat. Změny můžete také zapisovat zpět do knihovny. Vzhledem k tomu, že s knihovnou systémových fotek může pracovat více aplikací, můžete zaregistrovat pozorovatele, který bude upozorněn na změny pomocí PhotoLibraryObserverfunkce . Jakmile se změny objeví, může se vaše aplikace odpovídajícím způsobem aktualizovat. Tady je například jednoduchá implementace pro opětovné načtení zobrazení kolekce výše:

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 ();
        });
    }
}

Pokud chcete změny skutečně zapisovat zpět z aplikace, vytvoříte žádost o změnu. Každá třída modelu má přidruženou třídu žádosti o změnu. Chcete-li například změnit PHAsset, vytvoříte PHAssetChangeRequest. Kroky k provedení změn, které se zapisují zpět do knihovny fotek a odesílají pozorovatelům, jako je výše uvedené:

  1. Proveďte operaci úprav.
  2. Uložte filtrovaná data obrázků do PHContentEditingOutput instance.
  3. Proveďte žádost o změnu pro publikování změn z výstupu úprav.

Tady je příklad, který zapíše změnu na obrázek, který použije filtr Noir základního obrázku:

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));
    });
}

Když uživatel tlačítko vybere, použije se filtr:

Two examples, showing the photo before and after the filter is applied

A díky PHPhotoLibraryChangeObservertomu se změna projeví v zobrazení kolekce, když se uživatel vrátí zpět:

Photo collection view showing the modified photo