Определить ориентацию экрана iPhone - PullRequest
5 голосов
/ 16 июня 2009

Я хочу определить ориентацию iPhone с шагом 45 градусов. В идеале я бы хотел получить угол ориентации по любой оси.

Обнаружение, которое мне нужно сделать, аналогично тому, как Trism для iPhone мигает стрелкой в ​​направлении текущего нижнего положения экрана при изменении ориентации.

У меня есть кое-что закодированное, но я действительно не понимаю, как работают показания акселерометра, и могу использовать толчок в правильном направлении. Мой текущий код записывает текущий угол, но даже когда телефон ровный, я получаю показания, которые сильно меняются несколько раз в секунду.

- (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);
}

Пример из журнала, когда телефон плоский:

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

Ответы [ 2 ]

4 голосов
/ 16 июня 2009

Я думаю, что ваша проблема в том, что вы используете int переменные, когда хотите float.

Я думаю, accelerationX и –Y должны быть переменными экземпляра, и поэтому:

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

Должно дать вам больше того, что вы искали.

3 голосов
/ 16 июня 2009

Причина в том, что вы используете локальные переменные, а они не должны быть локальными.

Попробуйте сделать следующее:

Объявление переменных экземпляра:

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

...

other declarations

Обновление переменных в делегате акселерометра:

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

Он должен давать более точные результаты без резких скачков.

...