t011_IS 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:


assi_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:


t011_IB

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:


t011_IS