Bu bölümde sizlere iOS cihazlarla fotoğraf çekmeyi ve bu resmi bir veri dosyası (NSData) olarak kullanmayı anlatacağız. Yine daha önceki bölümlerde olduğu gibi SingleView bir uygulama yaratalım ve ekrana bir düğme ile resim gösterme amaçlı UIImageView ekleyelim. Amacımız düğmeye basıldığında fotoğraf çekme uygulamasını başlatıp çekilen resmi UIImageView içerisinde göstermek olacaktır.
Tasarımı oluşturduktan sonra ViewController.h dosyasına gelerek aşağıdaki tanımlamaları yapalım;
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (nonatomic, retain) IBOutlet UIImageView *previewImageView;
- (IBAction) takePicture:(id)sender;
@end
previewImageView fotoğraf çekildikten sonra resmin görüntüleneceği görsel öğedir. takePicture düğmeye basıldığında harekete geçer ve UIImagePickerController adlı sınıfı harekete geçirerek iOS ile beraber gelen fotoğraf çekme uygulamasını ekrana getirir. Fotoğraf çekme ekranında kullanıcının yaptığı hareketler UIImagePickerControllerDelegate üzerinden takip edilir. UINavigationControllerDelegate temsilcisinin çağrılması da fotoğraf çekme uygulamasının bir NavigationController üzerine gelme durumunda davranışının kontrol edilebilmesidir.
Fotoğraf çekme amacıyla UIImagePickerController’ı ekrana getiren metot aşağıdaki gibidir;
- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller
usingDelegate: (id <UIImagePickerControllerDelegate,
UINavigationControllerDelegate>) delegate
{
if(([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeCamera] == NO)
|| (delegate == nil)
|| (controller == nil))
return NO;
UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
cameraUI.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
cameraUI.allowsEditing = YES;
cameraUI.delegate = delegate;
[controller presentViewController:cameraUI animated:YES completion:^{
}];
return YES;
}
startCameraControllerFromViewController metodu çalıştırıldığında ilk olarak isSourceTypeAvailable ile cihazın fotoğraf çekme yeteneğini sorgular. Eğer eski bir iPhone ya da iPad varsa cihaz kamera taşımadığından fotoğraf çekme ekranı görüntülenmeyecektir. Daha sonra oluşturulan UIImagePickerController içerisinde aşağıdaki özellikleri değiştirme şansımız bulunmaktadır;
- sourceType : Fotoğraf kaynağını seçmemizi sağlar. Bu cihazın kamerası olabileceği gibi foto albüm de olabilir (UIImagePickerControllerSourceTypePhotoLibrary)
- cameraCaptureMode : Burada video ya da fotoğraf çekimini ayarlayabiliriz. sourceType değeri sadece UIImagePickerControllerSourceTypeCamera olarak belirlenmişse kullanılmalıdır, aksi takdirde uygulama hata verir.
- allowsEditing : Resim çekildikten sonra kullanıcının resim üzerinde basit düzenleme işlemleri yapmasını sağlar.
- delegate : Temsilci metotların nereden takip edileceğini belirtir.
- presentViewController metodu çalıştığında cihazın fotoğraf çekme uygulaması açılır.
Kullanıcının hareketleri temsilci metotlar üzerinden takip edilir. Burada kullanıcının fotoğrafı çekmesi sonucu aşağıdaki işlemleri gerçekleştirebiliriz;
- (void) imagePickerController: (UIImagePickerController *) picker didFinishPickingMediaWithInfo: (NSDictionary *) info
{
UIImage *originalImage, *editedImage, *imageToSave;
editedImage = (UIImage *) [info objectForKey:
UIImagePickerControllerEditedImage];
originalImage = (UIImage *) [info objectForKey:
UIImagePickerControllerOriginalImage];
if(editedImage)
{
imageToSave = editedImage;
}
else
{
imageToSave = originalImage;
}
UIImageWriteToSavedPhotosAlbum (imageToSave, nil, nil , nil);
[picker dismissViewControllerAnimated: YES completion:nil];
previewImageView.image = imageToSave;
}
Bu metot içerisinde NSDictionary tipinde gönderilen info değişkeni fotoğraf çekme uygulaması sonlandığında çekilen resimleri içerir. Eğer kullanıcı resim üzerinde bir düzenleme yaptıysa UIImagePickerControllerEditedImage anahtarıyla kullanıcının değiştirdiği resme ulaşılabilir. Çekilen orjinal resim ise UIImagePickerControllerOriginalImage anahtarıyla çekilir. UIImageWriteToSavedPhotosAlbum metodu resmin cihazın fotoğraf albümüne kayıt edilmesini sağlar ve kullanıcı onayı gerektirir. İşlem bittiğinde dismissViewControllerAnimated metoduyla fotoğraf çekme ekranı yok edilir. Kullanıcının çektiği resim ise previewImageView ile ekrana getirilir. Kodun tamamı aşağıdaki gibidir;
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize previewImageView;
#pragma mark - camera related functions
- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller
usingDelegate: (id <UIImagePickerControllerDelegate,
UINavigationControllerDelegate>) delegate
{
if(([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeCamera] == NO)
|| (delegate == nil)
|| (controller == nil))
return NO;
UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
cameraUI.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
cameraUI.allowsEditing = YES;
cameraUI.delegate = delegate;
[controller presentViewController:cameraUI animated:YES completion:^{
}];
return YES;
}
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void) imagePickerController: (UIImagePickerController *) picker didFinishPickingMediaWithInfo: (NSDictionary *) info
{
UIImage *originalImage, *editedImage, *imageToSave;
editedImage = (UIImage *) [info objectForKey:
UIImagePickerControllerEditedImage];
originalImage = (UIImage *) [info objectForKey:
UIImagePickerControllerOriginalImage];
if(editedImage)
{
imageToSave = editedImage;
}
else
{
imageToSave = originalImage;
}
}