2009-09-17 4 views
19

내 응용 프로그램은 현재 사용자 위치 (CoreLocation.framework)를 알고 있습니다. 사용자가 새 MapView를 열면 iPhone이 현재 위치를 다시 검색하기 시작합니다. 이를 건너 뛰거나 mkMapView의 첫 번째 사용자 위치를 변경할 수 있습니까?주어진 사용자 위치로 MKMapView를 초기화하는 방법은 무엇입니까?

편집 :

이 MKMapView 덮어 쓰기와 다른을 locationManager를 사용할 수 있습니까? 컨트롤러에서

답변

42

그렇습니다. 별도의 위치 관리자 객체를 가지고 해당 값을 mapview에 할당 할 수 있습니다 (BTW, 아래에서 '='를 사용하여 SO 코드 형식 작성기가 보킹되지 않도록합니다).

= UIViewController에는 MKMapViewCLLocationManager의 두 가지 속성이 있습니다.

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

= 현재 위치를 보여주는 워밍업 지연을 방지하려면 : 그것은지도보기의 userlocationlocation 속성 값을 가질 때 호출되는 가버 리지 않습니다. (약간의 메모리 돼지이지만 MapView가 타일을로드하고 갈 준비가 될 때까지 다시 기다려야합니다.)

= viewWillLoad에서 마지막으로 알려진 위치를 맞춤 bluemarble 주석에 채우고 표시 할 수 있습니다. 사용자 위치 추적을 켜기/끄기로 전환하고 알림을 받으면 동일한 숨기기 주석 표시 - 실제 대리석 트릭이 작동합니다. 지도 뷰의 자체 위치 관리자가 실행되고 데이터가 있으면 주석 마커를 사라지게 할 수 있습니다.

= viewController의 viewWillDisappear 메서드를 구현하고 mapview에서 수동으로 userLocation 추적을 해제하면 다음에 뷰를 표시 할 때 기본적으로 해제됩니다. 마지막으로 userLocation을 얻고 다음 번에 나가기 위해 저장하기를 원할 것입니다. 그렇게하면 viewWillAppear 메서드에서 모든 위치 지정 마커 저글링을 수행 할 수 있으며 준비가 완료 될 때까지 userLocation에 대해 걱정할 필요가 없습니다.

행운을 빈다.

+1

감사합니다. 이것은 예상되는 해결책은 아니지만 가장 가까운 기존 솔루션이라고 생각합니다. – jantimon

+0

네, mapView에서 userLocation을 초기 값으로 설정하는 것이 가능했다면 더 쉬울 것입니다 ... 아니면 자체 CLLocationManager 인스턴스를 사용하는 대신 기존 CLLocationManager 인스턴스를 사용할 수있게하는 것이 더 좋을 것입니다 ... 그러나 불행히도 그들은 ' 티. – Ramin

27

:

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

지도는 팔로 알토 근처에 중심이 될 것 나타나면

+0

내가 필요한 것은 아닙니다. 파란색 위치 표시기 ("현재 위치")의 위치를 ​​변경하고 싶습니다. – jantimon

+1

userLocation이 읽기 전용 속성이므로 사용자가 뭔가를 할 수 있는지 의심 스럽습니다. 유일한 합법적 인 방법은 Apple이 제공하고 청색 표시기를 비활성화하는 것입니다. 무의미한 것입니다. – zakovyrya

+1

500m x 500m 지역 설정 [mapView setRegion : MKCoordinateRegionMakeWithDistance (CLLocationCoordinate2Make (54.233498f, 1.99375f), 500, 500) ]; –

0

초기화에 false로 showUserLocation 속성을 설정하려고하고 region에게 이전 한지도보기를 복원 (이전지도가 삭제되기 전에 분명히 이것을 저장해야합니다).

원하는 게 맞습니까?

+0

아니요 지역에 관한 것이 아니라 위치 표시기에 관한 것 – jantimon

0

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

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

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

+0

처음 10 초 동안 사용자 위치가 표시되지 않거나 잘못된 것으로 표시됩니다. 새 MKMapView가 표시됩니다. 이 10 초 후에 모든 것이 잘됩니다. 그러나 내가 그 위치를 안다면 나는 그 10 초를 건너 뛰고 싶다. – jantimon

+1

어쩌면 오래되었지만 누군가가 이것을 읽으면 앱을 시작할 때 사용자 위치를 얻어야합니다. 그러면 GPS를 시작하여 사용자를 찾을 수 있습니다. 그렇게하면 사용자가지도를 열 때까지 이미 위치가 파악되었습니다. PS : 10 초 동안 꽤 정상적입니다. 위치를 설정하면 Google지도 앱도 몇 초가 걸립니다. – renevdkooi

관련 문제