그렇습니다. 별도의 위치 관리자 객체를 가지고 해당 값을 mapview에 할당 할 수 있습니다 (BTW, 아래에서 '='를 사용하여 SO 코드 형식 작성기가 보킹되지 않도록합니다).
= UIViewController
에는 MKMapView
과 CLLocationManager
의 두 가지 속성이 있습니다.
= MKMapView
과 원하는 다른 모든 창 크롬으로 XIB 파일을 만듭니다. 콘센트를 컨트롤러에 연결하십시오. MKMapView
이 사용자 위치를 따르지 않는지 확인하십시오.
= UIViewController가 CLLocationManagerDelegate
프로토콜을 구현하도록하십시오. 특히 새로운 위치 값을 사용할 수있을 때마다 호출되는 locationManager:didUpdateToLocation:fromLocation:
메소드를 구현하십시오. 컨트롤러를 위치 관리자의 위임자로 설정합니다.
= viewController의 loadView
메서드에서 NB를 MKMapView
으로로드하십시오. 사용자 피드백을주기 위해 UIActivityIndicatorView
회 전자를 넣고 startAnimating
으로 설정할 수 있습니다. 이벤트가 마지막 N 초 이후 업데이트되지 않았는지 locationManager:didUpdateToLocation:fromLocation:
체크 =
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];
: 그럼 시작합니다.그런 다음 위치 관리자에게 업데이트를 중지하고 회 전자에서 애니메이션을 중지하고 위도/경도 데이터를 가져 와서보기 범위 및 지역과 함께지도보기에 할당하여 줌하고 올바른 위치에 놓습니다.
= 이제 여기 까다로운 부분이 있습니다. 파란 대리석 '쓰레기'는 사용자 위치를 추적하는 mapview의 기능입니다. 실제 위치가 시작될 때까지 (또는 현재 위치에 대해 별도의 마커를 사용하고 자신의 위치를 유지할 때까지) 일시적으로 '가짜'해야합니다. 개인적으로 나는 사용자가 친숙한 파란 대리석으로 갈 것입니다.
= 시작시 바로 표시되도록하려면 위치 관리자가 반환 한 위치에 파란색 대리석 그래픽이 추가 된 맞춤형 MKAnnotationView를 만들어야합니다. 즉, 표시된 위치가있는 Mapview의 스냅 샷을 찍은 다음 청색 대리석을 그냥 찍은 사진을 사용자 정의 주석보기의 이미지로 사용하는 것입니다.
=지도를 적극적으로 따르려면지도 뷰의 사용자 위치 추적을 사용하고 실제 데이터를 가져 오는 경우 이전에 설정된 표식을 숨기고지도 뷰에 업데이트를 허용합니다. 다른 옵션은 기존 위치 관리자가 매초마다 계속해서 업데이트를 받고 파란색 대리석 주석의 위치를 직접 업데이트 할 수있게하는 것입니다.
는 = 맵뷰 MapView 자신의 userLocation는 업데이트가있는 viewDidLoad에 추가 할 수 있도록하려면
[self.map.userLocation addObserver:self
forKeyPath:@"location"
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location
는 = observeValueForKeyPath
를 구현합니다. 지도 및 위치 관리자 너무 포함 된의 ViewController에 대한 참조를 유지
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([self.map isUserLocationVisible]) {
[self.locationManager stopUpdatingLocation];
self.ownBlueMarble.hidden = YES;
}
// The current location is in self.map.userLocation.coordinate
}
= 현재 위치를 보여주는 워밍업 지연을 방지하려면 : 그것은지도보기의 userlocation
의 location
속성 값을 가질 때 호출되는 가버 리지 않습니다. (약간의 메모리 돼지이지만 MapView가 타일을로드하고 갈 준비가 될 때까지 다시 기다려야합니다.)
= viewWillLoad
에서 마지막으로 알려진 위치를 맞춤 bluemarble 주석에 채우고 표시 할 수 있습니다. 사용자 위치 추적을 켜기/끄기로 전환하고 알림을 받으면 동일한 숨기기 주석 표시 - 실제 대리석 트릭이 작동합니다. 지도 뷰의 자체 위치 관리자가 실행되고 데이터가 있으면 주석 마커를 사라지게 할 수 있습니다.
= viewController의 viewWillDisappear
메서드를 구현하고 mapview에서 수동으로 userLocation
추적을 해제하면 다음에 뷰를 표시 할 때 기본적으로 해제됩니다. 마지막으로 userLocation
을 얻고 다음 번에 나가기 위해 저장하기를 원할 것입니다. 그렇게하면 viewWillAppear
메서드에서 모든 위치 지정 마커 저글링을 수행 할 수 있으며 준비가 완료 될 때까지 userLocation에 대해 걱정할 필요가 없습니다.
행운을 빈다.
감사합니다. 이것은 예상되는 해결책은 아니지만 가장 가까운 기존 솔루션이라고 생각합니다. – jantimon
네, mapView에서 userLocation을 초기 값으로 설정하는 것이 가능했다면 더 쉬울 것입니다 ... 아니면 자체 CLLocationManager 인스턴스를 사용하는 대신 기존 CLLocationManager 인스턴스를 사용할 수있게하는 것이 더 좋을 것입니다 ... 그러나 불행히도 그들은 ' 티. – Ramin