13 Şubat 2012 Pazartesi

iPhone'da UISwipeGesture kullanımı












UISwipeGesture, iPhone uygulamalarında sıkça karşımıza çıkan parmağı ekran üzerinde ilerleterek sayfa çevirme hareketini kolaylıkla uygulamanıza eklemeye yardımcı olur.


UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGestureLeft)];

    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];

    [self.view addGestureRecognizer:recognizer];

    recognizer.delegate = self;

    [recognizer release];


Burada yapmanız gereken .h dosyanızda UIGestureRecognizerDelegate tanımlamasını yapmanızdır. Daha sonra init metodu içinde belirleyeceğiniz selector hareket algılandığı takdirde çağırılacak fonksiyona işaret eder. setDirection metodu ile hareketin yapıldığı yön seçilir. Burada sağ, sol, yukarı ve aşağı şeklinde dört hareket yönü mevcuttur.

Daha sonra hareketi algılamasını istediğiniz UIView objesine addGestureRecognizer metoduyla tanımlama yapmanız gerekmektedir. Örnekte ekranın tamamı hareketi beklemektedir.


- (void) handleGestureLeft{


// yapılacak işlemler

}


handleGestureLeft fonksiyonu hareket algılandığında çağırılacak ve içinde belirtilen işlemler yapılacaktır.



iPhone'da Uyarı Ekranı Çıkarmak












iPhone'da en sık kullanılan ekranlardan birisi de pop-up şeklinde karşımıza çıkan UIAlertView ekranıdır. Bu ekran genellikle kullanıcıya bir uyarı vermek ya da seçim yaptırmak amacıyla ekrana getirilir. En basit haliyle kullanıcıya bir mesaj verme amaçlı kullanımı şu şekildedir;


UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"Uyarı"

  message:@"Ben uyarıyım"

delegate:self 

cancelButtonTitle:@"Tamam" 

otherButtonTitles:nil]autorelease];


Burada kullanıcıya "Ben uyarıyım" yazılı bir mesaj gönderilecektir. Kullanıcı Tamam düğmesine bastığında da mesaj kendiliğinden kaybolacaktır.


Eğer kullanıcıdan Evet - Hayır gibi bir seçim yapması bekleniyorsa UIAlertView aşağıdaki gibi çağrılır;


UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Uyarı"

  message:@"İptal vela Devam" delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel") otherButtonTitles:NSLocalizedString(@"Continue", @"Continue"),nil];

alert.delegate = self;

    alert.tag = 10;

[alert show];


Burada kullanıcının karşısına iki adet buton çıkacak ve kullanıcıdan bir komut beklenecektir. Komutun karşılığını alacak fonksiyon aşağıdaki şekildedir;


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    if(buttonIndex == 1 && alertView.tag == 10){

// tamam tıklandı

    } else if(buttonIndex == 0 && alertView.tag == 10) {

// iptal tıklandı

    }

}


Burada basılan düğmenin index'ine göre istenilen işlemi yapabilirsiniz. Eğer kodunuzda birden fazla UIAlertView kullanıyorsanız ve delegate olarak aynı ViewController seçiliyse kullanıcıdan gelen komutları karıştırmamak için UIAlertView'in tag değerini ayarlamanız gerekir. Örneğimizde UIAlertView tag 10 olarak belirlenmiştir. Delegate metodun içinde de tag değerinin 10 olup olmadığı kontrol edilerek buton aksiyonunun doğru UIAlertView'den geldiği anlaşılır.


iPhone'da Lokalizasyon












Yazdığınız programların telefonun diline göre değişmesini istiyorsanız iPhone'un lokalizasyon özelliğinden faydalanmanız gerekmektedir. Lokalizasyon özelliği sayesinde programın içindeki bütün metinler telefonda ayarlanmış ülkeye göre otomatik olarak değişmektedir. Kullanıcı telefon ayarını İngilizce'den Türkçe'ye çektiğinde Türkiye lokal dosyası okunacak ve metinler bu dosya içindeki değerlerle değişecektir.


xCode projenizde yeni dosya ekleme ekranından iOs altında Resource bölümüne gelin ve buradan Strings File dosya tipini seçin. Next seçeneğinden sonra dosyanıza Localizable adını verin. Bu sayede key - value tipinde bir metin dosyanız oluşacaktır. Örnek olarak;


"Search" = "Search";

"History" = "History";

"Dictionaries" = "Dictionaries";


Burada soldaki değer anahtar, sağdaki değer de o anahtara karşılık gelen değerdir. Şimdi bu dosyayı tıklayarak sağdaki menüden Localization seçeneğine gelelim ve + işaretini tıklayarak yeni bir dil için dosyayı çoklayalım. Görüldüğü gibi Localizable.string altında (English) ve (Turkish) olarak iki yeni dosya görünecektir. Bu şekilde dosyayı birden fazla bölge için çoklayabilirsiniz. Şimdi yukarıdaki değerler için Türkçe strings dosyasını güncelleyelim;


"Search" = "Arama";

"History" = "Geçmiş";

"Dictionaries" = "Sözlükler";


İlgili tercümeleri yaptıktan sonra kodun içinde NSString tipinde değer döndüren NSLocalizedString(@"Search", @"Search"); fonksiyonuyla gerekli atamaları yapabilirsiniz.


self.title = NSLocalizedString(@"Search", @"Search");


UserDefaults kullanarak değer saklamak












iPhone'da veri saklama yollarından biri de UserDefaults kullanmaktır.


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setValue:value forKey:key];

[defaults synchronize];


Bu şekilde uygulamanıza özel bir depolama alanında istediğiniz verileri saklayabilirsiniz. Burada vereceğiniz anahtara göre istediğiniz veri tipini saklayabilirsiniz. synchronize metodu ise değer atamasından sonra değerleri diske yazacaktır. Burada dikkat etmeniz gereken eğer o anahtara önceden atanmış bir değer varsa bu dikkate alınmayacak, synchronize metodu sonrasında en güncel değer saklanacaktır. Bu yüzden veri kayıpları için kendiniz kontrol yapmalısınız.


Saklanan bir değer çağırmak içinse;


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

return [defaults objectForKey:userKey];


metodu kullanılır. standardUserDefaults özel bir metoddur ve saklanan değerleri geri çağırmak için kullanılır. objectForKey metoduna değere karşılık gelen anahtarı girdiğinizde istediğiniz bilgiye kavuşmuş olursunuz.


Bazı değerler serializable özelliği taşımadığından NSUserDefaults ile kayıt edilemezler. Bu durumda sistem loglarında bu durum size belirtilecektir. Çözüm olarak NSKeyedArchiver kullanılabilir.


NSData *data = [NSKeyedArchiver archivedDataWithRootObject:userInfo];


Bu işlemden sonra NSData değeri yukarıdaki örnekteki gibi kayıt edilebilir. Bu şekilde kayıt edilmiş bir değeri çağırmak içinse 


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSData *userData = [defaults objectForKey:userKey];

return [NSKeyedUnarchiver unarchiveObjectWithData:userData];


fonksiyonu kullanılır.


iPhone'da Animasyon












iPhone platformunun diğer platformlara göre en başarılı olduğu alanlardan birisi de animasyon yapma kolaylığıdır. UIView objeleri üzerindeki özellikler belirli zaman dilimleri verilerek istenildiği gibi değiştirilebilir. Bu sayede buton, resim gibi ekranda görüntülenen her türlü obje her türlü hareketi kolaylıkla yapabilmektedir.


Animasyon için aşağıdaki fonksiyon kullanılır;


[UIView beginAnimations:@"disappearSplashImageView" context:nil];

[UIView setAnimationDuration:5.5];

[UIView setAnimationDidStopSelector:@selector(animateOtherStuff:finished:context:)];

[splashImageView setAlpha:0.0];

[UIView commitAnimations];


Burada ilk satırda animasyona bir isim verilir. İkinci metod animasyonun süresini belirtir. AnimationDidStopSelector animasyon bittikten sonra çağırılacak metoddur ve animasyon bitişinde yapılacak işlemler burada belirtilir. Bundan sonra animasyona katılacak UIView nesneleri ve animasyon sonunda özelliklerinin ne olacağı tek tek belirtilir. Şekilde splashImageView nesnesi 5.5 saniye sonra gözden kaybolacaktır. commitAnimation metodu ise animasyonu başlatır.


- (void)animateOtherStuff:(NSString*) animationID finished:

(NSNumber*) finished context:(void*) context 

{

if ([animationID isEqualToString:@"disappearSplashImageView"]) {

[splashImageView release], splashImageView = nil;

}

}


animateOtherStuff metodu örneğimizde animasyon sonunda çağırılacak fonksiyon olarak belirtilmişti. Görüldüğü gibi animasyonId değişkeni splashImageView'ı yok edecek animasyona uyuyorsa splashImageView daha fazla kullanılmayacağından bellekten temizleme işlemleri çağırılmıştır. Burada istenildiği takdirde başka bir animasyon başlatılabilir.


iOS 4'ten itibaren kullanılan Block Animation sistemi ise yukarıdakine göre çok daha basittir.


    [UIView animateWithDuration:2.0

                     animations:^{ 

                         splashView.alpha = 0.0;

                     } 

                     completion:^(BOOL finished){

                         [splashView removeFromSuperview];

                     }];


Görüldüğü gibi block metodlar kullanılarak yapılan bu animasyonda süre animateWithDuration seçeneğinde belirtilir. animations bloğu içinde yapılacak animasyonlar tanımlanır. completion bloğu ise animasyon bittiğinde yapılacak işlemler için kullanılır.


Info.plist dosyası ve kullanımı












Her iPhone projesinde yer alan ProjeAdı-Info.plist dosyası uygulama ile ilgili önemli verilerin kayıt edildiği dosyadır. Bu dosya işletim sistemi tarafından okunarak uygulama ile ilgili arka planda çalışma desteği, ikon dosyası, açılış ekranı gibi bilgiler öğrenilir. 


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>CFBundleDevelopmentRegion</key>

<string>en</string>

<key>CFBundleDisplayName</key>

<string>${PRODUCT_NAME}</string>

<key>CFBundleExecutable</key>

<string>${EXECUTABLE_NAME}</string>

<key>CFBundleIconFiles</key>

<array/>

</dict>


Bu dosyayı elle modifiye edebileceğiniz gibi dilerseniz kendi değerlerinizi de ekleyebilirsiniz. Örneğin uygulamanızda Facebook paylaşımı varsa Facebook'un size verdiği App Id değerini burada saklayabilirsiniz. Bunun için yapmanız gereken tek şey buraya bir satır eklemek ve Dictonary formatını bozmadan değeri girmenizdir.


<key>FacebookAppId</key>

<string>355424377819912</string>    


Dictionary dosyaları key - value mantığına göre çalışır. Bu dosyaya girdiğiniz değerleri kodun içinden çağırmak içinse


NSDictionary* infoDict = [[NSBundle mainBundle] infoDictionary];


fonksiyonuyla dosyayı bir NSDictonary değişkenine atayabilirsiniz. Daha sonra da


NSString *facebookId = [infoDict objectForKey:@"FacebookAppId"];


komutuyla değere ulaşabilirsiniz.