getDistanceFrom Vs distanceFromLocation

Ste*_*hen 8 iphone

我遇到了getDistanceFrom和distanceFromLocation的问题.不推荐使用getDistanceFrom iOS 4.1和distanceFromLocation在3.1.3中不可用,我该如何解决这个问题.

还有其他人遇到过这个问题吗?

我的代码目前是:

CLLocationDistance kilometers;
        if ([currentLocation respondsToSelector: @selector(distanceFromLocation:)])
        {
            kilometers = [currentLocation distanceFromLocation:previousLocation] / 1000;
        }
        else
        {
            //kilometers = [currentLocation getDistanceFrom:previousLocation] / 1000;
            kilometers = [currentLocation performSelector: @selector(getDistanceFrom:) withObject: previousLocation] / 1000;
        }
Run Code Online (Sandbox Code Playgroud)

根据我编译的iOS,我会在行上获得"无效的二进制操作数":

kilometers = [currentLocation distanceFromLocation:previousLocation] / 1000;
            kilometers = [currentLocation performSelector: @selector(getDistanceFrom:) withObject: previousLocation] / 1000;
Run Code Online (Sandbox Code Playgroud)

问候,斯蒂芬

Tom*_*ing 14

CédricLuthi 有一篇博文,对此有很好的解决方案.

简而言之,您需要在main.m中输入以下内容并确保#import <objc/runtime.h>:

Method getDistanceFrom = class_getInstanceMethod([CLLocation class], @selector(getDistanceFrom:));
class_addMethod([CLLocation class], @selector(distanceFromLocation:), method_getImplementation(getDistanceFrom), method_getTypeEncoding(getDistanceFrom));
Run Code Online (Sandbox Code Playgroud)

然后,您可以distanceFromLocation:在任何操作系统上使用

  • 还要确保#import <CoreLocation/CoreLocation.h> (2认同)

Pav*_*eev 11

我用自己的方法.它速度更快,可以在iOS 3.x和iOS 4.x上使用.


- (double)distanceFrom:(CLLocationCoordinate2D)locationA to:(CLLocationCoordinate2D)locationB

{
    double R = 6368500.0; // in meters

    double lat1 = locationA.latitude*M_PI/180.0;
    double lon1 = locationA.longitude*M_PI/180.0;
    double lat2 = locationB.latitude*M_PI/180.0;
    double lon2 = locationB.longitude*M_PI/180.0;

    return acos(sin(lat1) * sin(lat2) + 
                cos(lat1) * cos(lat2) *
                cos(lon2 - lon1)) * R;
}