문제

내 앱은 현재 사용자 위치(CoreLocation.framework)를 알고 있습니다.사용자가 새 MapView를 열자마자 iPhone은 현재 위치를 다시 검색하기 시작합니다.이를 건너뛰거나 mkMapView의 첫 번째 사용자 위치를 변경할 수 있습니까?

편집하다:

MKMapView를 덮어쓰고 다른 LocationManager를 사용할 수 있습니까?

도움이 되었습니까?

해결책

예, 별도의 위치 관리자 개체를 갖고 해당 값을 mapview에 할당할 수 있습니다(BTW, SO 코드 포맷터가 중단되는 것을 방지하기 위해 아래 목록 접두사로 '='를 사용하고 있습니다).

= 당신의 UIViewController 두 가지 별도의 속성을 유지합니다.하나에서 하나 MKMapView 그리고 하나에서 하나 CLLocationManager.

= 다음을 사용하여 XIB 파일을 만듭니다. MKMapView 그리고 당신이 원하는 다른 창 크롬.콘센트를 컨트롤러 속성에 연결합니다.확실하게 하다 MKMapView 사용자 위치를 따르지 않습니다.

= UIViewController가 CLLocationManagerDelegate 프로토콜-특히 locationManager:didUpdateToLocation:fromLocation: 새 위치 값을 사용할 수 있을 때마다 호출되는 메서드입니다.컨트롤러를 위치 관리자의 대리인으로 설정하겠습니다.

= viewController의 loadView 방법을 사용하여 NIB를 로드합니다. MKMapView 그 안에.사용자 피드백을 제공하기 위해 다음을 게시할 수 있습니다. UIActivityIndicatorView 스피너로 설정하고 startAnimating.그런 다음 다음부터 시작합니다.

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];

= 에서 locationManager:didUpdateToLocation:fromLocation: 지난 N초 이후 이벤트가 업데이트되었는지 확인하세요.그런 다음 위치 관리자에게 업데이트를 중지하고 스피너에 애니메이션을 중지하라고 지시하고 위도/경도 데이터를 가져와 보기 범위 및 지역과 함께 지도 보기에 할당하여 확대/축소하고 올바른 위치에 중심을 맞추도록 합니다.

= 이제 까다로운 부분은 다음과 같습니다.파란색 구슬 'throbber'는 사용자 위치를 추적하는 지도뷰의 기능입니다.실제 위치가 시작될 때까지 잠시 '가짜'로 만들어야 합니다(또는 현재 위치에 대해 별도의 마커를 사용하고 위치를 직접 유지해야 합니다).개인적으로 나는 사용자에게 친숙한 파란색 대리석을 사용하고 싶습니다.

= 시작 시 바로 표시되도록 하려면 위치 관리자가 반환한 위치에 파란색 대리석 그래픽만 추가하여 사용자 지정 MKAnnotationView를 만들어야 합니다.이는 위치가 표시된 지도 보기의 스냅샷을 찍은 다음 파란색 대리석만 포토샵으로 처리하고 이를 사용자 정의 주석 보기의 이미지로 사용하는 것을 의미합니다.

= 지도를 적극적으로 따르도록 하려면 지도 보기의 사용자 위치 추적을 활성화하고 실제 데이터를 얻을 때 이전에 설정한 마커를 숨기고 지도 보기에서 업데이트를 수행하도록 할 수 있습니다.다른 옵션은 기존 위치 관리자가 매초마다 업데이트를 계속 수신하고 파란색 대리석 주석의 위치를 ​​직접 업데이트하도록 허용하는 것입니다.

= 지도 보기의 자체 userLocation이 업데이트를 수행하도록 하려면 viewDidLoad에 추가하세요.

[self.map.userLocation addObserver:self 
forKeyPath:@"location" 
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) 
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location

= 구현 observeValueForKeyPath.다음과 같은 경우 호출됩니다. location 지도뷰의 속성 userlocation 값은 다음과 같습니다.

-(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
}

= 현재 위치를 표시할 때 준비 지연을 피하려면 지도와 위치 관리자가 포함된 viewController에 대한 참조를 유지하여 사라지지 않도록 하세요(약간의 메모리를 많이 차지하지만 놓으면 MapView가 타일을 로드하고 사용할 준비가 될 때까지 다시 기다립니다.

= 에서 viewWillLoad 마지막으로 알려진 위치를 사용자 정의 bluemarble 주석에 입력하여 표시할 수 있습니다.userLocation 추적을 켜거나 끄고 알림을 받으면 동일한 숨기기-주석 표시-실제 대리석 트릭이 작동합니다.지도 보기의 자체 위치 관리자가 시작되고 데이터가 있으면 주석 표시가 사라지도록 할 수 있습니다.

= viewController를 구현하고 싶을 수도 있습니다. viewWillDisappear 방법을 사용하여 수동으로 끄기 userLocation 지도 보기에서 추적하므로 다음에 보기가 표시될 때 기본적으로 꺼집니다.당신은 또한 마지막으로 알려지는 것을 원할 것입니다 userLocation 다음 여행을 위해 저장해 두세요.그렇게 하면 위치 지정 마커 저글링을 모두 수행할 수 있습니다. viewWillAppear 방법을 사용하면 준비가 될 때까지 userLocation이 방해하는 것에 대해 걱정할 필요가 없습니다.

행운을 빌어요.

다른 팁

컨트롤러에서 :

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    CLLocationCoordinate2D coord = {latitude: 37.423617, longitude: -122.220154};
    MKCoordinateSpan span = {latitudeDelta: 1, longitudeDelta: 1};
    MKCoordinateRegion region = {coord, span};
    [mapView setRegion:region];
}

지도가 나타나면 Palo Alto 근처의 중앙에 있습니다.

설정해보십시오 showUserLocation 초기화시 거짓으로 속성을 한 다음 복원하십시오 region 이전에 맵보기 (이전지도가 파괴되기 전에 이것을 저장해야합니다).

이것이 당신이 원하는 것입니까?

다른 위치 관리자를 사용할 필요가 없습니다. 원하는 지점을 지도에 추가하고 원하는 다른 논리를 통해 업데이트할 수 있습니다.

원격 제어 자동차에 대한 소켓 연결이 있고 해당 자동차가 페이로드에 지리적 위치 정보가 포함된 소켓 데이터를 다시 보낸다고 가정해 보겠습니다.이를 분석하고 지도에서 미리보기 이미지의 위치를 ​​실시간으로 업데이트할 수 있습니다.이를 위해서는 "userLocation" 속성이 필요하지 않지만 원하는 경우 표시할 수 있습니다.

사용자의 위치는 읽기 전용이므로 사용하거나 사용하지 않을 수 있습니다.그렇다고 해서 필요한 작업을 수행하기 위해 다른 위치 관리자가 필요하다는 의미는 아닙니다.귀하의 앱에는 해당 기능이 실제로 필요하지 않은 것 같지만 귀하의 질문을 오해할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top