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
'Programing' 카테고리의 다른 글
Android SDK 업데이트 :“폴더를 이동하지 못했습니다.” (0) | 2020.10.31 |
---|---|
React Native 절대 위치 수평 중심 (0) | 2020.10.31 |
명령 줄에서 실행되는 PHP 스크립트에 변수 전달 (0) | 2020.10.31 |
"리터럴"이란 단어는 무엇을 의미합니까? (0) | 2020.10.31 |
C #에서 "사용"블록은 언제 사용해야합니까? (0) | 2020.10.31 |