T#011 – Rileviamo i movimenti dell’iPhone
Oggi vedremo come rilevare, grazie all’accelerometro integrato in ogni dispositivo, il movimento del nostro iPhone. I dati che andremo a leggere sono quelli riferiti ai 3 assi principali x, y e z dell’iPhone, che combinati insieme ci permettono di controllare l’esatto orientamento del nostro dispositivo nello spazio. Questo può tornare utile per un’infinità di diverse applicazioni, ad esempio come metodo di controllo per i videogiochi, alternativo ai classici tasti di un gamepad tradizionale. Potremo in questo modo controllare ad esempio lo sterzo di una macchina tramite gesti naturali o variare l’inclinazione di un piano dove può liberamente muoversi una pallina facendole evitare eventuali ostacoli.
Con questo tutorial ci limiteremo però a mostrare tramite 3 UILabel, i valori letti e a controllare l’attributo “progress” di tre oggetti di tipo “UIProgressView”. Di seguito uno schema degli assi di rotazione dell’iPhone:

Iniziamo con il nostro tutorial. Apriamo Xcode, creiamo un nuovo progetto e dall’elenco dei template disponibili scegliamo “View-based Application”. Diamo un nome alla nostra applicazione, ad esempio “myAccel”, scegliamo dove salvare il progetto e andiamo avanti.
Apriamo il file “myAccelViewController.h” e inseriamo il seguente codice:
#import <UIKit/UIKit.h> @interface myAccelViewController : UIViewController <UIAccelerometerDelegate>{ IBOutlet UILabel *xLabel; IBOutlet UILabel *yLabel; IBOutlet UILabel *zLabel; IBOutlet UIProgressView *xProgress; IBOutlet UIProgressView *yProgress; IBOutlet UIProgressView *zProgress; } @property (nonatomic, retain) IBOutlet UILabel *xLabel; @property (nonatomic, retain) IBOutlet UILabel *yLabel; @property (nonatomic, retain) IBOutlet UILabel *zLabel; @property (nonatomic, retain) IBOutlet UIProgressView *xProgress; @property (nonatomic, retain) IBOutlet UIProgressView *yProgress; @property (nonatomic, retain) IBOutlet UIProgressView *zProgress; @end
Come vedete abbiamo innanzitutto aggiunto il protocollo “UIAccelerometerDelegate”, dopodichè abbiamo dichiarato sei oggetti IBOutlet, tre di tipo UILabel e tre di tipo UIProgressView. Collegheremo questi oggetti ai rispettivi che andremo a disegnare tramite Interface Builder. Abbiamo inoltre dichiarato le “property” di questi sei oggetti, in modo da poter utilizzare tranquillamente tutte le proprietà e i metodi dei nostri oggetti nel resto del programma.
Salviamo, apriamo il file “myAccelViewController.m” e iniziamo a scrivere il codice vero e proprio che farà funzionare il nostro programma. Iniziamo a scrivere la seguente riga di codice:
@synthesize xLabel, yLabel, zLabel, xProgress, yProgress, zProgress;Grazie a questa istruzione potremo usare tutte le “caratteristiche” offerte dagli oggetti dichiarati nel file di intestazione. Togliamo i caratteri che commentano il metodo “viewDidLoad” e modifichiamolo come segue:
- (void)viewDidLoad { [super viewDidLoad]; [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0f/15.0f)]; [[UIAccelerometer sharedAccelerometer] setDelegate:self }
Così facendo non facciamo altro che impostare l’intervallo di tempo tra una rilevazione di un movimento e un’altra e settare il delegato dell’accelerometro a “self”. Ora non resta che implementare il codice che ad ogni lettura di dati dall’accelerometro, mostri il valore letto nelle etichette x, y e z e imposti inoltre tale valore nella proprietà “progress” delle “UIProgressView” in modo da avere un ritorno visivo del movimento rilevato.
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ xLabel.text = [[NSString alloc] initWithFormat:@"%f", acceleration.x]; yLabel.text = [[NSString alloc] initWithFormat:@"%f", acceleration.y]; zLabel.text = [[NSString alloc] initWithFormat:@"%f", acceleration.z]; xProgress.progress = ABS(acceleration.x); yProgress.progress = ABS(acceleration.y); zProgress.progress = ABS(acceleration.z); }
Con il codice abbiamo terminato, possiamo quindi salvare e aprire Interface Builder per disegnare l’interfaccia grafica facendo doppio-click sul file “myAccelViewController.xib”. Trasciniamo nella vista 3 UILabel che useremo come etichette, modificando la loro proprietà “Text” in “X:”, “Y:” e “Z:”. Inseriamo quindi nella view altre 3 UILabel e 3 UIProgressView. Clicchiamo su “File’s Owner” e tramite la finestra “My Accel View Controller Connections” effettuiamo i rispettivi collegamenti tra questi ultimi 6 oggetti e i rispettivi creati tramite Xcode.
Dovreste ottenere una vista simile alla seguente:

Potete salvare e chiudere Interface Builder. Da Xcode clicchiamo su “Build and Run” e testiamo la nostra applicazione. Per poter rilevare i movimenti occorrerà installare l’applicazione sul vostro dispositivo in quanto, le ovvie limitazione dell’iPhone Simulator, non permettono la rilevazione di movimenti. In basso uno screenshot dell’applicazione in esecuzione:


















bestiale