MKDistanceFormatter英尺到英尺

时间:2018-02-14 17:10:04

标签: ios objective-c

我需要用脚踩英里。有没有办法做到这一点?

我使用的是MKDistanceFormatterUnitsImperial,但它目前显示的是脚。我猜它是因为直到达到某个值它才会改变。

编辑:对不起!我以为我不需要代码让我理解,但这里是:

     in some method...
     self.distanceValueLabel.text = [NSString stringWithFormat:@"%@", [self.formatter stringFromDistance:0]];

    - (MKDistanceFormatter *)formatter
    {
        if (!_formatter) {
            _formatter = [[MKDistanceFormatter alloc] init];
            [self updateFormatterUnits:nil];
        }

        return _formatter;
    }

    - (void)updateFormatterUnits:(NSNotification *)notification {
        self.formatter.units = MKDistanceFormatterUnitsMetric;
        SBSettingValue *distanceUnit = [[SBSettingsManager instance] getValueForSetting:[SBSettingsDefinition distanceUnit]];
        if ([distanceUnit isEqualTo:[SBSettingsDefinition distanceUnitImperial]]) {
            self.formatter.units = MKDistanceFormatterUnitsImperial; // here    
        }
    }

PS:距离不断更新,因此,格式化程序继续完成其工作。但它从零开始。零英尺,而不是英里。

PS2:我也想知道从哪一点到几英里。

谢谢!

2 个答案:

答案 0 :(得分:0)

简短回答

所以你发现MKDistanceFormatter开始输出"脚"对于小数字和切换到"英里"只有当距离变得足够大时;我担心这是故意的。

由于区域设置和MKDistanceFormatterUnits的不同组合会产生不同的结果,因此无论如何都无法以一般方式控制粒度。使用我的默认设置,将2传递给格式化程序会产生" 2 m"而不是" 2 cm&#34 ;,例如。记录CLLocationDistance(仅为Double)以米为单位进行测量。

所以简短的回答是:你搞砸了。 :)

答案很长

以下所有内容取决于您的使用案例,可能无法直接适用。

您想要的是使用将数值与特定单位组合在一起的类型或格式化程序。这也意味着您必须确保从" miles"到"千米",取决于区域设置。你可以完全自己编写代码。

您还可以与Foundation的新NSMeasurements API(需要macOS 10.12和iOS 10)进行交互: https://developer.apple.com/documentation/foundation/nsmeasurement

但是,您必须将CLLocationDistance距离(以米为单位)转换为正确的NSUnitLength。可以使用一组NSUnitConverter个实例进行转换。

有些事情如下:

CLLocationDistance distanceInMeters = ...; // Obtain from notification
NSMeasurement *measurementInMeters = [[NSMeasurement alloc] initWithDoubleValue:distanceInMeters unit:[NSUnitLength meters]];
NSMeasurement *measurement = [[NSLocale currentLocale] usesMetricSystem]
    ? [measurementInMeters measurementByConvertingToUnit:[NSUnitLength kilometers]]
    : [measurementInMeters measurementByConvertingToUnit:[NSUnitLength miles]];
NSMeasurementFormatter *formatter = [[NSMeasurementFormatter alloc] init];
NSString *distanceText = [formatter stringFromMeasurement: measurement];

self.distanceValueLabel.text = distanceText;

单位转换的有趣读物:

答案 1 :(得分:-1)

自从我投票失败后更新了。但由于OP的问题中没有代码,很难说明从哪里开始。

let distance = 2000.0
let formatter = MKDistanceFormatter()
formatter.unitStyle = .full

let distanceString = formatter.string(fromDistance: distance)