Mobil Programlama

iOS

Gesture Recognizer

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

GestureRecognizer sınıfı kullanıcının ekranda gerçekleştirdiği parmak hareketlerini kolayca algılamanız ve bunlara tepki vermeniz amacıyla hazırlanmıştır. Örneğin, ekrana uzun süre basıldığında bir elemanın silinmesi ya da iki parmakla bir elemanın büyütülmesi gibi işlemleri GestureRecognizer sınıflarıyla gerçekleştirebilirsiniz. Burada kullanabileceğiz sınıfları aşağıdaki gibi sıralayabiliriz;

  • UITapGestureRecognizer: Ekrana yapılan dokunmaları takip eder.
  • UIPinchGestureRecognizer : Ekranda iki parmakla yapılan ve genelde büyütme / küçültme amaçlı kullanılan hareketi takip eder.
  • UIPanGestureRecognizer: Parmakla yapılan taşıma hareketlerini takip eder.
  • UISwipeGestureRecognizer : Parmakla yapılan sayfa değiştirmeye benzer hareketleri takip eder.
  • UIRotatitionGestureRecognizer: Ekrandaki döndürme amaçlı parmak hareketlerini algılar.
  • UILongPressGestureRecognizer: Ekrana uzun süre basma hareketini algılar.

Kullanıcının farklı bir deneyim yaşamasını ve düğmeler dışında uygulamanızı dokunarak yönetmesini istiyorsanız yukarıda anlatılan sınıflar size yardımcı olacaktır. Buradaki temel mantık ekrandaki bir UIView elemanına GestureRecognizer tanımlanması ve kullanıcıdan beklenen hareket geldiğinde ilgili kodun çağırılmasıdır.

Bu bölümdeki örnekte ise kullanıcının parmak hareketiyle bir UIView elemanını sürüklemesini göstereceğiz. Ardından elemana uzun süre tıklandığında ekrana bir soru balonu gelmesini sağlayacağız. Öncelikle yeni bir proje oluşturalım (tercihen Single View Application) ve uygulamada karşımıza gelecek ilk ViewController içinde aşağıdaki fonksiyonları tanımlayalım:

 

@interface ViewController : UIViewController
- (IBAction) handlePan:(id)sender;
- (IBAction) handleLongPress:(id)sender;
@end

 

Buradaki handlePan fonksiyonu kullanıcının ekrandaki sürükleme hareketi sonucunda çalışacaktır. handleLongPress ise kullanıcının ekrana uzun süre basması sonucu harekete geçecektir.

Şimdi ViewController içinde bir UIView oluşturalım ve bir UIPanGestureRecognizer tanımlayalım:

 

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    UIView *holderView = [[UIView alloc] initWithFrame:CGRectMake(40, 40, 60, 60)];
    holderView.tag = HOLDER_TAG;
    UIImageView *turkcellView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"turkcell.jpg"]];
    [holderView addSubview:turkcellView];
    turkcellView.frame = CGRectMake(0, 0, 60, 60);
    [self.view addSubview:holderView];
    [holderView addGestureRecognizer:panGesture];
}

 

panGesture adlı değişken tanımlanırken action değişkeni kullanıcıdan doğru hareket algılandığında çalıştırılacak fonksiyona işaret eder. Burada yapılan işlemi kısaca anlatırsak holderView adında 60x60 ebatlarında bir UIView görsel öğesi oluşturarak içine bir UIImageView ekliyoruz. Buradaki UIImageView ise turkcell.jpg adında bir dosyadan geliyor ve 60x60 boyutlarında olması sağlanıyor. Daha sonra addSubview metoduyla holderView görselini ekrana getiriyoruz. UIView sınıflarına bir UIGestureRecognizer eklemek için addGestureRecognizer metodu kullanılır. Biz de bu metodla panGesture adlı hareket takibini yapan UIGestureRecognizer sınıfını ekliyoruz. Böylece kullanıcı ekrandaki resmi tıklayıp sürükleme hareketi yaptığında handlePan: metodu uyarılacak ve ilgili UIView hareket edecektir. Şimdi handlePan: metodunu da aşağıdaki gibi oluşturalım:

 

- (IBAction) handlePan:(id)sender
{
    UIPanGestureRecognizer *recognizer = (UIPanGestureRecognizer *) sender;
    
    [self.view bringSubviewToFront:recognizer.view];
    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
        recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}

 

UIPanGestureRecognizer içinde yer alan translationInView metodu ile kullanıcının parmak hareketinin ilgili UIView üzerinde yarattığı değişimi takip edebiliriz. Bu noktada yapmamız gereken parmağın sürükleme ile yarattığı değişimi takip edip resmin orta noktasının ekran koordinatlarını güncellemek olacaktır. Gerekli güncellemeyi yaptıktan sonra da translation değerini sıfırlıyoruz. Bu şekilde kullanıcının parmak hareketiyle resmin hareket ettiğini göreceğiz.

UIPanGestureRecognizer

Şimdi aynı resme uzun süreli basmayı tanıyacak bir metot daha ekleyelim. Bunun için kodda aşağıdaki güncellemeyi gerçekleştiriyoruz:

 

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc]
        initWithTarget:self action:@selector(handleLongPress:)];
    
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    UIView *holderView = [[UIView alloc] initWithFrame:CGRectMake(40, 40, 60, 60)];
    holderView.tag = HOLDER_TAG;
    UIImageView *turkcellView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"turkcell.jpg"]];
    [holderView addSubview:turkcellView];
    turkcellView.frame = CGRectMake(0, 0, 60, 60);
    [self.view addSubview:holderView];
    [holderView addGestureRecognizer:panGesture];
    [holderView addGestureRecognizer:longGesture];
}

 

Burada yine aynı şekilde bir UILongPressGestureRecognizer tanımlaması yapıyoruz. handleLongPress metodu ise uzun süreli basma işlemi karşısında harekete geçecek fonksiyon olacaktır. Şimdi handleLongPress fonksiyonuna göz atalım:

 

- (IBAction) handleLongPress:(id)sender
{
    if([sender state] == UIGestureRecognizerStateEnded)
    {
        UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Turkcell!"
            message:@"Resim ilk haline gelsin mi?"
            delegate:self
            cancelButtonTitle:@"Hayir"
            otherButtonTitles:@"Tamam", nil];
        [message show];
    }
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == 1)
    {
        [[self.view viewWithTag:HOLDER_TAG] setFrame:CGRectMake(40, 40, 60, 60)];
    }
}

 

Kullanıcı resme uzun süre basmaya başladığında handleLongPress metodu harekete geçecektir. Burada UIGestureRecognizerStateEnded değeri kullanıcının parmağını çektiği anı yakalamamızı sağlar. Uzun süreli basıştan sonra ekrana bir uyarı penceresi gelir ve resmi ilk yerine koyup koymamamız sorulur. Kullanıcı uyarı ekranında Tamam düğmesine bastığında resim ilk başlangıç yeri olan 40,40 noktası gönderilecektir. Burada dikkat edilmesi gereken resmin belirtilen tag değeri ile çağrılmasıdır.

Ekran Görüntüsü