Programing

CLLocationManager없이 MKMapView를 사용자의 현재 위치로 확대하려면 어떻게합니까?

lottogame 2020. 10. 31. 09:13
반응형

CLLocationManager없이 MKMapView를 사용자의 현재 위치로 확대하려면 어떻게합니까?


MKMapView자동에 사용자의 위치를 표시합니다은 "사용자의 현재 위치를"라는 옵션이있다 map.

이 위치가 발견되면 (그리고 변경된 경우)이 위치로 이동하고 확대 / 축소하고 싶습니다.

문제는에서 사용자 위치가 업데이트 될 때 호출되는 메서드가없는 것처럼 보이 map므로 zoom/scroll.

MKMapView에서 사용자 위치를 얻었거나 업데이트 했을 때 알림을받을 수있는 방법 이 있습니까? 내 자신 CLLocationManager의 업데이트를 사용 하면지도의 사용자 마커 업데이트와 일치하지 않으므로 파란색 핀이 나타나기 몇 초 전에지도가 이동하고 확대 / 축소 될 때 어리석은 것처럼 보입니다.

이것은 기본 기능처럼 느껴지지만 솔루션을 찾기 위해 몇 주를 보냈지 만 가까운 것은 찾지 못했습니다.


userLocation.location자산에 대한 KVO 알림을 등록해야합니다 MKMapView.

이렇게하려면이 코드를 viewDidLoad:ViewController 또는지도보기가 초기화 된 위치에 넣으십시오.

[self.mapView.userLocation addObserver:self  
        forKeyPath:@"location"  
           options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)  
           context:NULL];

그런 다음이 메서드를 구현하여 KVO 알림을받습니다.

- (void)observeValueForKeyPath:(NSString *)keyPath  
                      ofObject:(id)object  
                        change:(NSDictionary *)change  
                       context:(void *)context {  

    if ([self.mapView showsUserLocation]) {  
        [self moveOrZoomOrAnythingElse];
        // and of course you can use here old and new location values
    }
}

이 코드는 저에게 잘 작동합니다.
BTW self는이 컨텍스트에서 내 ViewController입니다.


이것은 나를 위해 일한 ddnv와 Dustin의 대답의 조합입니다.

mapView는 MKMapView * mapView의 이름입니다.

viewDidLoad에서이 행을 추가하십시오.로드에 더 많은 행이있을 수 있습니다. 이것은 단지 단순화되었습니다.

- (void) viewDidLoad
{
    [self.mapView.userLocation addObserver:self 
                                forKeyPath:@"location" 
                                   options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) 
                                   context:nil];
}

그런 다음지도를 현재 위치로 이동하는 실제 목록 방법을 만듭니다.

// Listen to change in the userLocation
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{       
    MKCoordinateRegion region;
    region.center = self.mapView.userLocation.coordinate;  

    MKCoordinateSpan span; 
    span.latitudeDelta  = 1; // Change these values to change the zoom
    span.longitudeDelta = 1; 
    region.span = span;

    [self.mapView setRegion:region animated:YES];
}

Don't forget to dealloc properly and unregister the observer:

- (void)dealloc 
{
    [self.mapView.userLocation removeObserver:self forKeyPath:@"location"];
    [self.mapView removeFromSuperview]; // release crashes app
    self.mapView = nil;
    [super dealloc];
}

Since iOS 5.0 Apple has added a new method to MKMapView. This method does exactly what you want and more.

Take a look at: https://developer.apple.com/documentation/mapkit/mkmapview

- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated;

You can monitor when the MKMapView updates the user location on the map by implementing the MKMapViewDelegate protocol. Just implement :

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation      {
    CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy;
    if (accuracy ......) {
    } 
}

This callback should be perfectly in sync with what is displayed on the map.


Try this:

[mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

No problem... Inside the viewDidLoad method of your UIViewController subclass that has the MKMapView add this (assuming your MKMapView is named map):

CLLocation *location = [[[CLLocation alloc] initWithLatitude:map.centerCoordinate.latitude longitude:map.centerCoordinate.longitude] autorelease]; //Get your location and create a CLLocation
MKCoordinateRegion region; //create a region.  No this is not a pointer
region.center = location.coordinate;  // set the region center to your current location
MKCoordinateSpan span; // create a range of your view
span.latitudeDelta = BASE_RADIUS / 3;  // span dimensions.  I have BASE_RADIUS defined as 0.0144927536 which is equivalent to 1 mile
span.longitudeDelta = BASE_RADIUS / 3;  // span dimensions
region.span = span; // Set the region's span to the new span.
[map setRegion:region animated:YES]; // to set the map to the newly created region

참고URL : https://stackoverflow.com/questions/2473706/how-do-i-zoom-an-mkmapview-to-the-users-current-location-without-cllocationmanag

반응형