PhotoKit di Xamarin.iOS
PhotoKit adalah kerangka kerja yang memungkinkan aplikasi untuk mengkueri pustaka gambar sistem dan membuat antarmuka pengguna kustom untuk melihat dan memodifikasi kontennya. Ini termasuk sejumlah kelas yang mewakili aset gambar dan video, serta koleksi aset seperti album dan folder.
Izin
Sebelum aplikasi Anda dapat mengakses pustaka foto, pengguna akan disajikan dengan dialog izin. Anda harus memberikan teks penjelasan dalam file Info.plist untuk menjelaskan bagaimana aplikasi Anda menggunakan pustaka foto, misalnya:
<key>NSPhotoLibraryUsageDescription</key>
<string>Applies filters to photos and updates the original image</string>
Objek Model
PhotoKit mewakili aset ini dalam apa yang disebut objek model. Objek model yang mewakili foto dan video itu sendiri berjenis PHAsset
. berisi PHAsset
metadata seperti jenis media aset dan tanggal pembuatannya.
Demikian pula, PHAssetCollection
kelas dan PHCollectionList
berisi metadata tentang koleksi aset dan daftar koleksi masing-masing. Koleksi aset adalah grup aset, seperti semua foto dan video untuk tahun tertentu. Demikian juga, daftar koleksi adalah grup koleksi aset, seperti foto dan video yang dikelompokkan menurut tahun.
Mengkueri Data Model
PhotoKit memudahkan kueri data model melalui berbagai metode pengambilan. Misalnya, untuk mengambil semua gambar, Anda akan memanggil PHAsset.Fetch
, melewati PHAssetMediaType.Image
jenis media.
PHFetchResult fetchResults = PHAsset.FetchAssets (PHAssetMediaType.Image, null);
PHFetchResult
Instans kemudian akan berisi semua PHAsset
instans yang mewakili gambar. Untuk mendapatkan gambar itu sendiri, Anda menggunakan PHImageManager
(atau versi penembolokan, PHCachingImageManager
) untuk membuat permintaan gambar dengan memanggil RequestImageForAsset
. Misalnya, kode berikut mengambil gambar untuk setiap aset dalam PHFetchResult
untuk ditampilkan dalam sel tampilan koleksi:
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;
}
Ini menghasilkan kisi gambar seperti yang ditunjukkan di bawah ini:
Menyimpan Perubahan ke Pustaka Foto
Itulah cara menangani kueri dan membaca data. Anda juga dapat menulis perubahan kembali ke pustaka. Karena beberapa aplikasi yang tertarik dapat berinteraksi dengan pustaka foto sistem, Anda dapat mendaftarkan pengamat untuk diberi tahu tentang perubahan menggunakan PhotoLibraryObserver
. Kemudian, ketika perubahan masuk, aplikasi Anda dapat memperbarui dengan sesuai. Misalnya, berikut adalah implementasi sederhana untuk memuat ulang tampilan koleksi di atas:
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 ();
});
}
}
Untuk benar-benar menulis perubahan kembali dari aplikasi Anda, Anda membuat permintaan perubahan. Setiap kelas model memiliki kelas permintaan perubahan terkait. Misalnya, untuk mengubah PHAsset
, Anda membuat PHAssetChangeRequest
. Langkah-langkah untuk melakukan perubahan yang ditulis kembali ke perpustakaan foto dan dikirim ke pengamat seperti yang di atas adalah:
- Lakukan operasi pengeditan.
- Simpan data gambar yang difilter ke
PHContentEditingOutput
instans. - Buat permintaan perubahan untuk menerbitkan perubahan dari output pengeditan.
Berikut adalah contoh yang menulis kembali perubahan pada gambar yang menerapkan filter noir Gambar Inti:
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));
});
}
Saat pengguna memilih tombol , filter diterapkan:
Dan berkat PHPhotoLibraryChangeObserver
, perubahan tercermin dalam tampilan koleksi saat pengguna menavigasi kembali: