Nem nagy mágia ezek meghatározása. A UIApplication objektum két callback függvényét fogjuk használni.
- (void)deviceOrientationChanged:(struct __GSEvent *)event
Minden esetben meghívódik, ha a telefon térbeli elhelyezkedése megváltozik. Ebben az esetben a UIHardware deviceOrientation metódusával kérdezhetjük le, hogy a készülék melyik oldalára fordítva helyezkedik el. - (void)deviceOrientationChanged:(struct __GSEvent *)event
{
int orient = [UIHardware deviceOrientation: YES];
NSString *message;
switch(orient){
case 0: message = @"Flat, screen upward";
break;
case 1: message = @"Normal position";
break;
case 2: message = @"Upside down";
break;
case 3: message = @"Rotated left";
break;
case 4: message = @"Rotated right";
break;
case 5: message = @"Changing orientation (?)";
break;
case 6: message = @"Screen downward";
break;
default:
message = @"Unknown";
}
[tvMessage setText: message];
}
Nem gyakran ugyan, de előfordul, hogy nem a megfelelő érték villan be rövid időre, de szerintem jól használható azokban az esetekben, ha nincs szükség precízebb felbontásra.{
int orient = [UIHardware deviceOrientation: YES];
NSString *message;
switch(orient){
case 0: message = @"Flat, screen upward";
break;
case 1: message = @"Normal position";
break;
case 2: message = @"Upside down";
break;
case 3: message = @"Rotated left";
break;
case 4: message = @"Rotated right";
break;
case 5: message = @"Changing orientation (?)";
break;
case 6: message = @"Screen downward";
break;
default:
message = @"Unknown";
}
[tvMessage setText: message];
}
Ellenkező esetben egy másik callback függvényt kell implementálni.
- (void) acceleratedInX: (float)x Y:(float)y Z:(float)z
A kísérletezéshez a következő metódust készítettem el. - (void) acceleratedInX: (float)x Y:(float)y Z:(float)z
{
[tvMessage setText: [NSString stringWithFormat:@"Acceleration\nX: %f\nY: %f\nZ: %f", x, y, z]];
}
Azt figyeltem meg, hogy minden iránytényező esetében az értékek -0.45 és +0.45 között ingadoznak. Fórumokban olvastam, hogy -0.5 és +0.5 között vehetnek fel értéket. {
[tvMessage setText: [NSString stringWithFormat:@"Acceleration\nX: %f\nY: %f\nZ: %f", x, y, z]];
}
Ha balra döntöm a telefont, akkor X értéke 0-tól a maximum felé tart, míg Y a minimum értéktől 0-hoz. Miután teljesen bal oldalára fordítottam és tovább billentem, hogy fejtetőn álljon, X értéke visszatér 0-hoz, Y pedig a maximumhoz. Tovább fordítva X eléri a minimumot és Y a nullához közelít. Vissza térve az normál állapothoz X ismét a nullához tér vissza és Y is a minimum értékhez.
Most magam felé billentve a készüléket Y a minimum értékből nullához jut el, mire a fejem fölé jut a telefon, Z 0-ból a maximumba. Y a maximumába, Z pedig ismét nullába kerül, mire a telefon megint fejjel lefelé áll. Mire vízszintesbe kerül a telefon Y a nullát fogja elérni, míg Z a minimumát. Ismét visszatérve a normál állapothoz Y értéke minimumon, Z pedig 0-án fog állni.
Az érzékelő gravitációs elvű, tehát nincs értelme függőleges tengely mentén történő elfordulást vizsgálni.
Jó játékot.