2011-12-19 12 views
10

Tôi có hai đối tượng CLLocation và tôi muốn hiển thị khoảng cách giữa chúng với định dạng đẹp và đẹp. Giống như "22 chân", "58 bãi", hay "2.3 dặm" ​​Khoảng cách in đẹp cho 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]; 

Về cơ bản, là có bất cứ điều gì trong thư viện iOS mà có thể chuyển đổi một khoảng cách đến một chuỗi khá hay tôi phải làm điều này bằng tay?

Trả lời

12

Thật không may, bạn phải thực hiện việc này theo cách thủ công.

Và nếu bạn làm như vậy, xin đừng quên kiểm tra:

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

Phần còn lại của thế giới sẽ đánh giá cao.

+0

Điều này không còn đúng nữa. Xin vui lòng xem câu trả lời của Alexander. – xytor

0

Bạn có thể sử dụng chuỗi định dạng để thực hiện điều này:

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

Nhưng không có chức năng để chuyển đổi giữa các phép đo khoảng cách hoặc bất cứ điều gì như thế.

4

TTTLocationFormatter từ FormatterKit có thể chính xác những gì bạn đang tìm kiếm. Nếu nó không phải là bạn có thể có thể sử dụng nó như là một điểm khởi đầu.

42

iOS 7 (và OS X 10.9) giới thiệu MKDistanceFormatter thực hiện chính xác những gì bạn cần:

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

NSString *prettyString = [df stringFromDistance:distance]; 

Swift phiên bản:

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

let prettyString = df.stringFromDistance(distance) 
15

Tôi chỉ muốn lưu ý rằng, như với việc phát hành iOS8 sẽ có NSFormatters mới cho chính xác loại vấn đề này.

Sẽ có NSLengthFormatter, NSMassFormatterNSEnergyFormatter rất dễ sử dụng - xem iOS8 NSFormatter tutorial này. Dưới đây là một ví dụ sử dụng LengthFormatter với nhanh chóng:

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

Giống như với DateFormatter, bạn sẽ không còn nhất thiết phải sử dụng NSLocale để in các đơn vị riêng của mình.

+0

Như Klaas đã lưu ý gần một năm trước câu trả lời này, [MKDistanceFormatter] (https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/) đã được thêm vào trong iOS 7 và hoàn toàn phù hợp với điều này mục đích. –

+2

'NSLengthFormatter' cung cấp các tùy chọn tốt hơn cho việc định dạng giá trị số, trong khi không đưa ra kết quả chính xác cho miền địa phương nơi chúng sử dụng hệ mét trừ khoảng cách. 'MKDistanceFormatter' tiếc là không cung cấp cho bạn các tùy chọn định dạng số và xuất hiện để làm tròn giá trị số. – ThomasW