Определение ориентации экрана iPhone
-
14-09-2019 - |
Вопрос
Я хочу определить ориентацию 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
Решение
Я думаю, ваша проблема в том, что вы используете int
переменные, когда вы хотите float
.
Я думаю, что accelerationX
и –Y должны быть переменными экземпляра и, таким образом:
accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);
Должно дать вам больше того, что вы искали.
Другие советы
Причина в том, что вы используете локальные переменные, в то время как они не должны быть локальными.
Попробуйте сделать следующее:
Объявлять переменные экземпляра:
@interface YourViewControllerClass: UIViewController {
float accelerationX, accelerationY;
}
...
other declarations
Обновите переменные в делегате акселерометра:
accelerationX = acceleration.x * kfilteringFactor + accelerationX * (1.0 - kfilteringFactor);
accelerationY = acceleration.y * kfilteringFactor + accelerationY * (1.0 - kfilteringFactor);
Это должно давать более точные результаты без резких скачков.