Mobil Programlama

iOS

iPhone'da Sensör Kullanımı

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

Bu bölümde iPhone cihazında yer alan hareket sensörünü kullanmayı göstereceğiz. Şu anda piyasada mevcut bütün iPhone cihazlarda yer alan Accelerometer sensörü sayesinde cihazın x, y ve z ekseninde yaptığı her türlü hareketi takip etme olanağımız vardır. Bu sayede uygulamamızın kullanıcıdan gelen hareketlerle eyleme geçmesini sağlayabiliriz. Örneğin kullanıcı cihazı salladığında gizli bir fonksiyonu harekete geçirebilir ya da hazırladığımız bir oyunun cihaz hareketleriyle kontrol edilmesini sağlayabiliriz.

Biz bu bölümde cihaz ters çevrildiğinde kısa süreli titremesini sağlayacak bir uygulama hazırlayacağız. Bunun için yeni bir SingleView uygulama oluşturalım ve ViewController.xib dosyasında aşağıdaki değişiklikleri gerçekleştirelim:

Ekrana sürüklediğimiz üç adet UILabel bize sensörden gelen ve cihazın x, y, z eksenlerindeki değişimini belirten değerleri görüntülememizi sağlayacak. Bunun için daha önce olduğu gibi ViewController.h dosyasında aşağıdaki tanımları yapalım ve bu UILabel öğelerini ilgili değişkenlere bağlayalım:

 

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIAccelerometerDelegate>
{
}
@property (nonatomic, retain) IBOutlet UILabel *xLabel;
@property (nonatomic, retain) IBOutlet UILabel *yLabel;
@property (nonatomic, retain) IBOutlet UILabel *zLabel;
@end

 

Bu işlemi gerçekleştirdikten sonra .m dosyasına giderek viewDidLoad metodu içerisinde sensör dinlemesini başlatalım. Sensörü dinleyebilmek için UIAccelerometerDelegate sınıfının .h dosyası içerisinde tanımlanmasına dikkat ediniz.

 

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIAccelerometer *acceloremeterListener = [UIAccelerometer sharedAccelerometer];
    acceloremeterListener.delegate = self;
    acceloremeterListener.updateInterval = 1.0f/10.0f;
}

 

UIAccelerometer sınıfı içerisinde yer alan sharedAccelerometer cihazın hareket sensörünü belirtir. Burada tanımlanan delegate ile sensörden gelen verileri ViewController sınıfı içerisinde değerlendirme şansı buluruz. updateInterval ise sensörün verilerinin hangi sıklıkta takip edileceğini gösterir. Eğer oyun uygulaması gibi hassas bir kontrol istiyorsanız güncelleme sıklığını arttırmanız gerekir. UIAccelerometerDelegate içerisinde yer alan accelerometer: (UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration metodu ile sensörden gelen veriyi izleyebiliriz:

 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    xLabel.text = [NSString stringWithFormat:@"x : %f", acceleration.x];
    yLabel.text = [NSString stringWithFormat:@"y : %f", acceleration.y];
    zLabel.text = [NSString stringWithFormat:@"z : %f", acceleration.z];
}

 

Burada acceleration değişkeni sensörün verdiği bilgileri içerecektir. Biz her eksen için gelen veriyi ekrana metin olarak yazdırıyoruz.

Şimdi de telefon ters çevrildiğinde titremesini sağlayacak uygulamayı gerçekleştirelim. Titreşim için AudioToolbox framework’ü projemize eklememiz gerekmektedir. Titreşimi ise aşağıdaki fonksiyon yardımıyla gerçekleştireceğiz:

 

- (void) vibrate
{
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}

 

Cihazın 180 derece dönüş hareketini z ekseninde yaptığı hareketten takip edebiliriz. Cihazın z eksenindeki yaptığı değişimi eski değerleriyle karşılaştırdığımızda negatif alandan pozitif alana doğru yapılan değişimin aslında cihazın kendi ekseni etrafında döndüğünü belirttiğini görürüz. Yani kullanıcı cihazı ters çevirdiğinde z ekseninin verdiği değerler pozitiften negatife (yada tersi) dönüşür. Biz de güncel değeri daha önceki değerle çarptığımızda 0‘dan küçük bir sonuç elde edersek bunu cihazın ters çevrilmesi olarak yorumlayabiliriz. Şimdi bunu yapan kodu görelim:

 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    xLabel.text = [NSString stringWithFormat:@"x : %f", acceleration.x];
    yLabel.text = [NSString stringWithFormat:@"y : %f", acceleration.y];
    zLabel.text = [NSString stringWithFormat:@"z : %f", acceleration.z];
    if(acceleration.z * last_z < 0)
    {
        [self vibrate];
    }
    last_x = acceleration.x;
    last_y = acceleration.y;
    last_z = acceleration.z;
}

 

Gördüğünüz gibi cihaz ters çevrildiğinde z eksenindeki değerlerin işareti değişiyor ve biz de bunu bir çarpım yaparak yakalıyoruz. Bu durumda vibrate metodu ile cihaz titreşime geçiyor. ViewController dosyalarının son hali:

 

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIAccelerometerDelegate> {
    float last_x,last_y,last_z;
}
@property (nonatomic, retain) IBOutlet UILabel *xLabel;
@property (nonatomic, retain) IBOutlet UILabel *yLabel;
@property (nonatomic, retain) IBOutlet UILabel *zLabel;
@end

 

 

#import "ViewController.h"
#import <AudioToolbox/AudioToolbox.h>
@interface ViewController ()
@end
@implementation ViewController
@synthesize xLabel;
@synthesize yLabel;
@synthesize zLabel;
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIAccelerometer *acceloremeterListener = [UIAccelerometer sharedAccelerometer];
    acceloremeterListener.delegate = self;
    acceloremeterListener.updateInterval = 1.0f/10.0f;
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    xLabel.text = [NSString stringWithFormat:@"x : %f", acceleration.x];
    yLabel.text = [NSString stringWithFormat:@"y : %f", acceleration.y];
    zLabel.text = [NSString stringWithFormat:@"z : %f", acceleration.z];
    if(acceleration.z * last_z < 0)
    {
        [self vibrate];
    }
    last_x = acceleration.x;
    last_y = acceleration.y;
    last_z = acceleration.z;
}
- (void) vibrate
{
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end