Я пытаюсь использовать компас в моем приложении ios. И у меня есть одна проблема с этим. Если я реализую
locationManagerShouldDisplayHeadingCalibration
и return YES
, тогда отобразится дисплей калибровки. Но я должен сделать это, как карты с яблоками. То есть Иногда должен отображаться дисплей калибровки. Когда компас должен быть калиброван.
Калибровка компаса objective-c
Ответ 1
ОК. Я не мог оставить комментарий, поэтому я подумал, что должен оставить ответ, поскольку ответ Клода Холла был мне полезен.
Я использую эту улучшенную версию отзыва Claude Houle .
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
if(!manager.heading) return YES; // Got nothing, We can assume we got to calibrate.
else if(manager.heading.headingAccuracy < 0 ) return YES; // 0 means invalid heading, need to calibrate
else if(manager.heading.headingAccuracy > 5 ) return YES; // 5 degrees is a small value correct for my needs, too.
else return NO; // All is good. Compass is precise enough.
}
Также хотел сказать, что говорит Клод Хоуль, почти реализующий API docs здесь, в котором говорится:
Если вы вернете НЕТ из этого метода или не предоставите для него реализацию в своем делетете, Core Location не отображает предупреждение калибровки заголовка. Даже если предупреждение не отображается, калибровка может все же происходить естественным образом, когда любые мешающие магнитные поля удаляются от устройства. Однако, если устройство не может откалибровать себя по какой-либо причине, значение в свойстве titleAccuracy любых последующих событий будет отражать некалиброванные показания.
Ответ 2
Я использую следующий код:
@property (nonatomic, retain) CLHeading * currentHeading; // Value updated by @selector(locationManager:didUpdateHeading:)
...
...
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
if( !self.currentHeading ) return YES; // Got nothing, We can assume we got to calibrate.
else if( self.currentHeading.headingAccuracy < 0 ) return YES; // 0 means invalid heading. we probably need to calibrate
else if( self.currentHeading.headingAccuracy > 5 )return YES; // 5 degrees is a small value correct for my needs. Tweak yours according to your needs.
else return NO; // All is good. Compass is precise enough.
}
Ответ 3
Более прямолинейное решение:
Objective-C
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
{
CLLocationDirection accuracy = [[manager heading] headingAccuracy];
return accuracy <= 0.0f || accuracy > 10.0f;
}
Это использует тот факт, что селектора, выполняемые на объектах nil, всегда возвращают нуль, и тот факт, что точность никогда не будет действительной и равна 0.0f (то есть на 100% точно).
Swift
Из-за введения опций, простейшее решение Swift требует разветвления и будет выглядеть примерно так:
func locationManagerShouldDisplayHeadingCalibration(manager: CLLocationManager) -> Bool {
if let h = manager.heading {
return h.headingAccuracy < 0 || h.headingAccuracy > 10
}
return true
}
Обратите внимание, что мы смотрим на headingAccuracy
, для которого Apple docs:
Положительное значение в этом свойстве представляет потенциальную ошибку между величиной, сообщаемой свойством магнитного хеджирования, и фактическое направление магнитного севера. Таким образом, чем ниже значение этого свойства, тем точнее заголовок. Отрицательное значение означает, что указанный заголовок недействителен, что может произойти, когда устройство некалиброванные или имеются сильные помехи от локальных магнитных поля.
Ответ 4
manager.heading - это CLHeading. поэтому manager.heading > 5 даст предупреждение. self.currentHeading.headingAccuracy > 5 является истинным.
Ответ 5
На моем iPhone6 заголовокAccuracy, как правило, 25.0, поэтому просто возвращает ДА и полагается на iOS, чтобы определить, когда показывать экран калибровки, кажется, лучше всего делать. Отбрасывание показаний с помощью заголовка & 0.0 предотвращает использование "неправильных" заголовков.