Xamarin.iOS'ta PhotoKit
PhotoKit, uygulamaların sistem görüntü kitaplığını sorgulamasına ve içeriğini görüntülemek ve değiştirmek için özel kullanıcı arabirimleri oluşturmasına olanak tanıyan bir çerçevedir. Resim ve video varlıklarının yanı sıra albümler ve klasörler gibi varlık koleksiyonlarını temsil eden bir dizi sınıf içerir.
İzinler
Uygulamanızın fotoğraf kitaplığına erişebilmesi için önce kullanıcıya bir izinler iletişim kutusu sunulur. Uygulamanızın fotoğraf kitaplığını nasıl kullandığını açıklamak için Info.plist dosyasında açıklayıcı metin sağlamanız gerekir, örneğin:
<key>NSPhotoLibraryUsageDescription</key>
<string>Applies filters to photos and updates the original image</string>
Model Nesneleri
PhotoKit bu varlıkları model nesneleri olarak adlandıran öğede temsil eder. Fotoğrafları ve videoları temsil eden model nesneleri türündedir PHAsset
. , PHAsset
varlığın medya türü ve oluşturulma tarihi gibi meta verileri içerir.
Benzer şekilde, PHAssetCollection
ve PHCollectionList
sınıfları sırasıyla varlık koleksiyonları ve koleksiyon listeleri hakkında meta veriler içerir. Varlık koleksiyonları, belirli bir yıla ait tüm fotoğraflar ve videolar gibi varlık gruplarıdır. Benzer şekilde, koleksiyon listeleri de yıllara göre gruplandırılmış fotoğraflar ve videolar gibi varlık koleksiyonları gruplarıdır.
Model Verilerini Sorgulama
PhotoKit, çeşitli getirme yöntemleriyle model verilerini sorgulamayı kolaylaştırır. Örneğin, tüm görüntüleri almak için medya türünü geçirerek PHAssetMediaType.Image
öğesini çağırabilirsinizPHAsset.Fetch
.
PHFetchResult fetchResults = PHAsset.FetchAssets (PHAssetMediaType.Image, null);
Örnek PHFetchResult
daha sonra görüntüleri temsil eden PHAsset
tüm örnekleri içerir. Görüntüleri almak için öğesini çağırarak RequestImageForAsset
görüntü için istekte bulunmak üzere (veya önbelleğe alma sürümünüPHCachingImageManager
) kullanırsınız PHImageManager
. Örneğin, aşağıdaki kod koleksiyon görünümü hücresinde görüntülenecek bir içindeki PHFetchResult
her varlık için bir görüntü alır:
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;
}
Bu, aşağıda gösterildiği gibi bir görüntü kılavuzuna neden olur:
Değişiklikleri Fotoğraf Kitaplığına Kaydetme
Verileri sorgulama ve okuma bu şekilde işlenir. Ayrıca, değişiklikleri kitaplığa geri yazabilirsiniz. Birden çok ilgili uygulama sistem fotoğraf kitaplığıyla etkileşime geçinebildiğinden, kullanarak değişikliklerden PhotoLibraryObserver
haberdar olmak için bir gözlemci kaydedebilirsiniz. Ardından, değişiklikler geldiğinde uygulamanız buna göre güncelleştirilebilir. Örneğin, yukarıdaki koleksiyon görünümünü yeniden yüklemek için basit bir uygulama aşağıda verilmişti:
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 ();
});
}
}
Değişiklikleri uygulamanızdan geri yazmak için bir değişiklik isteği oluşturursunuz. Model sınıflarının her birinin ilişkili bir değişiklik isteği sınıfı vardır. Örneğin, bir PHAsset
öğesini değiştirmek için bir PHAssetChangeRequest
oluşturursunuz. Fotoğraf kitaplığına geri yazılan ve yukarıdaki gibi gözlemcilere gönderilen değişiklikleri gerçekleştirme adımları şunlardır:
- Düzenleme işlemini gerçekleştirin.
- Filtrelenen görüntü verilerini bir
PHContentEditingOutput
örneğe kaydedin. - Değişiklikleri düzenleme çıkışından yayımlamak için bir değişiklik isteğinde bulunabilirsiniz.
Aşağıda, Çekirdek Görüntü noir filtresi uygulayan bir görüntüde yapılan değişikliği geri yazan bir örnek verilmiştir:
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));
});
}
Kullanıcı düğmeyi seçtiğinde filtre uygulanır:
ve sayesinde PHPhotoLibraryChangeObserver
, kullanıcı geri döndüğünde değişiklik koleksiyon görünümüne yansıtılır: