2011-12-19 6 views
10

Tengo dos objetos CLLocation y me gustaría mostrar la distancia entre ellos en un formato bonito y bonito. Al igual que "22 pies", "58 yardas", o "A 2.3 millas"Pretty Print Distances para iOS

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:42.333297 longitude:-71.588858]; 
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:42.353297 longitude:-71.578858]; 

float target = [location1 getDistanceFrom:location2]; 

Básicamente, ¿hay algo en la biblioteca IOS que puede convertir una distancia a una cadena bastante o tengo que hacerlo manualmente?

Respuesta

12

Lamentablemente, tiene que hacer esto manualmente.

Y si lo hace, por favor no se olvide de comprobar:

[[[NSLocale currentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue] 

El resto del mundo agradecería.

+0

Esto ya no es cierto. Por favor, vea la respuesta de Alexander. – xytor

0

Puede utilizar el formato de cadenas de lograr esto:

//distance to 2 decimal places 
NSString *target = [NSString stringWithFormat:@"%.2f miles", distance]; 

pero no hay ninguna funcionalidad para la conversión entre las mediciones de distancia o algo por el estilo.

42

iOS 7 (y OS X 10.9) introdujo MKDistanceFormatter que hace exactamente lo que necesita:

CLLocationDistance distance = 1320.0; 
MKDistanceFormatter *df = [[MKDistanceFormatter alloc]init]; 
df.unitStyle = MKDistanceFormatterUnitStyleFull; 

NSString *prettyString = [df stringFromDistance:distance]; 

versión Swift:

let distance = 1320.0 
let df = MKDistanceFormatter() 
df.unitStyle = .Full 

let prettyString = df.stringFromDistance(distance) 
15

solo quería hacer notar, que, como con el lanzamiento de iOS8 habrá nuevo NSFormatters para exactamente este tipo de problema.

Habrá NSLengthFormatter, NSMassFormatter y NSEnergyFormatter que son muy fácil de usar - ver este iOS8 NSFormatter tutorial. Aquí hay un ejemplo usando el LengthFormatter con rapidez:

let lengthFormatter = LengthFormatter() 
print("Kilometer: ", lengthFormatter.string(fromValue:1000, unit: .kilometer)) //Kilometer: 1,000 km 

Al igual que con DateFormatter, ya no necesariamente tiene que usar NSLocale para imprimir la propia unidad.

+0

Como Klaas notó casi un año antes de esta respuesta, [MKDistanceFormatter] (https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/) se agregó en iOS 7 y es exactamente adecuado para esto propósito. –

+2

'NSLengthFormatter' ofrece mejores opciones para el formato del valor numérico, mientras que no proporciona el resultado correcto para las configuraciones regionales donde usan el sistema métrico, excepto las distancias. 'MKDistanceFormatter' desafortunadamente no le da opciones de formateo numérico y parece redondear el valor numérico. – ThomasW