2009-06-16 8 views
5

Estoy queriendo detectar la orientación del iPhone en incrementos de 45 grados. Idealmente, me gustaría poder obtener el ángulo de orientación a lo largo de cualquier eje.Detectar la orientación de la pantalla del iPhone

La detección que tengo que hacer es similar a cómo Trism for the iPhone muestra una flecha hacia la posición inferior actual de la pantalla cuando cambia la orientación.

Tengo algo codificado pero realmente no entiendo cómo funcionan las lecturas del acelerómetro y podría usar un pequeño empujón en la dirección correcta. Mi código actual registra el ángulo actual, pero incluso cuando el teléfono es plano obtengo lecturas que varían muchísimo varias veces por segundo.

- (void) checkOrientation:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration 
{ 
    int accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); 
    int accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor); 

    float currentRawReading = (atan2(accelerationY, accelerationX)) * 180/M_PI; 
    NSLog(@"Angle: %f",currentRawReading); 
} 

de ejemplo de registro mientras el teléfono es plana:

2009-06-16 17:29:07.987 [373:207] Angle: 0.162292 
2009-06-16 17:29:07.994 [373:207] Angle: 179.838547 
2009-06-16 17:29:08.014 [373:207] Angle: 179.836182 
2009-06-16 17:29:08.032 [373:207] Angle: -90.000000 
2009-06-16 17:29:08.046 [373:207] Angle: 179.890900 
2009-06-16 17:29:08.059 [373:207] Angle: -90.000000 
2009-06-16 17:29:08.074 [373:207] Angle: 179.917908 
2009-06-16 17:29:08.088 [373:207] Angle: -179.950424 
2009-06-16 17:29:08.106 [373:207] Angle: 90.000000 
2009-06-16 17:29:08.119 [373:207] Angle: 90.000000 
2009-06-16 17:29:08.134 [373:207] Angle: -179.720245 

Respuesta

4

creo que tu problema es que usted está utilizando int las variables cuando se quiere float.

creo que el accelerationX y -Y debería ser variables de instancia y, por tanto:

accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); 
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor); 

deben darle más de lo que estaban buscando.

+0

Gracias por su respuesta, he cambiado el código para usar flotantes de fuentes, pero todavía estoy obteniendo el resultado de los valores fluctuantes que se calculan cuando el dispositivo está acostado. – Simon

+0

Se agregaron algunas líneas del registro a la pregunta. – Simon

+0

Ah, se perdió su comentario la primera vez con respecto a las variables de instancia, parece que podría ser la solución, se comunicará con usted. – Simon

3

La razón es que está utilizando variables locales, mientras que no deberían ser locales.

tratar de hacer lo siguiente:

declarar variables de instancia:

@interface YourViewControllerClass: UIViewController { 
    float accelerationX, accelerationY; 
} 

... 

other declarations 

las variables de actualización en delegado acelerómetro:

accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor); 
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor); 

Se debe dar resultados más precisos y sin saltos bruscos.

Cuestiones relacionadas