Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MKMapView和放大用户的最佳方式';s位置_Ios_Objective C_Mkmapview_Ios8_Core Location - Fatal编程技术网

Ios MKMapView和放大用户的最佳方式';s位置

Ios MKMapView和放大用户的最佳方式';s位置,ios,objective-c,mkmapview,ios8,core-location,Ios,Objective C,Mkmapview,Ios8,Core Location,嘿,我有一个地图视图,可以在加载视图时放大用户的位置。目前,我使用CLLocationManager查找用户位置,并在didUpdateLocations委托方法中初始化映射。但是,由于这被多次调用,我使用一个全局BOOL,它在映射设置一次后设置为true,然后再也不设置它。代码如下: 定义全局BOOL并在viewDidLoad中将其设置为false: @implementation MainMapViewController { BOOL hasInitializedMap; }

嘿,我有一个地图视图,可以在加载视图时放大用户的位置。目前,我使用
CLLocationManager
查找用户位置,并在didUpdateLocations委托方法中初始化映射。但是,由于这被多次调用,我使用一个全局
BOOL
,它在映射设置一次后设置为true,然后再也不设置它。代码如下:

定义全局
BOOL
并在viewDidLoad中将其设置为
false

@implementation MainMapViewController
{
    BOOL hasInitializedMap;
} 

- (void)viewDidLoad
{
    [super viewDidLoad];

    hasInitializedMap = NO;
}
然后,我获取用户的位置并在
(void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)位置中设置地图缩放
委托方法:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    [self initializeMainMapView:location.coordinate.longitude latitude:location.coordinate.latitude];
}

- (void)initializeMainMapView:(float)longitude latitude:(float)latitude
{
    if (!hasInitializedMap)
    {
        CLLocationCoordinate2D zoomLocation;
        zoomLocation.latitude = latitude;
        zoomLocation.longitude = longitude;

        MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 1500, 1500);
        [mainMapView setRegion:viewRegion animated:YES];

        hasInitializedMap = YES;
    }
}

这段代码可以工作,但让我想知道是否有更好的方法来做到这一点。我讨厌使用这样的全局标志,因为它会让代码变得混乱,而且最多也是草率的。有没有更好的方法来做我想做的事情?是否存在仅在第一次更新用户位置时才调用的委托方法?我能用MKMapView来实现这一点,而完全忘记
CoreLocation
吗?

我有几种方法。。。事实上,这个框架已经改变了好几次,所以我不记得我是怎么决定的。MKMapkit确实有显示用户位置的方法:

此属性不指示用户的位置在地图上是否实际可见,仅指示地图视图是否应尝试显示它。将此属性设置为“是”会导致地图视图使用核心位置框架查找当前位置并尝试在地图上显示它。只要此属性为“是”,地图视图将继续跟踪用户的位置并定期更新。此属性的默认值为“否”

显示用户的位置并不保证该位置在地图上可见。用户可能已将地图滚动到其他点,导致当前位置在屏幕外。要确定用户的当前位置当前是否显示在地图上,请使用userLocationVisible属性

用户的位置将显示为注释。您可以获取注释并放大该注释。更好的方法是将该标志与具有方法-mapView:DidUpdateUserslocation:

也许在你得到第一个之后,你可以将地图的跟踪模式改为无(我不确定这是否会删除用户位置注释,如果删除了,你可以很容易地用合适的皮肤在那里放置一个地图别针)-setUserTrakingMode:animated:是MKMap上可用于此目的的方法


我要提醒的一点是,在过去编写与用户位置相关的应用程序时,需要几秒钟才能获得准确的位置。在锁定位置之前,您可能希望先让GPS发出几次ping。我发现最初的几次滴答声可能非常不准确。希望这能有所帮助。

我删除了locationManager代理,转而只使用MKMapKit。谢谢你的链接,我想我明白了!令人惊叹的!如果你需要更多的细节,请告诉我。我在家里有一个项目,做一些类似的事情,我可以从那里得到一些精确的代码。