2013-06-04 2 views
0

탭이있는 tabbar 컨트롤러를로드하는 앱이 있습니다. 그 중 하나는지도보기입니다. 그것은이 코드가 사용자의 위치를 ​​확대하도록 설정된다두 번째보기가 나타날 때까지 MapView 확대/축소 위치를 고정하는 방법

- (void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    _mapView.showsUserLocation = YES; 

    CLLocationCoordinate2D zoomLocation; 

    //IF no city was selected, use userLocation as center 
    if (!self.cityWasSelected) { 
     zoomLocation.latitude = self.userLocation.coordinate.latitude; 
     zoomLocation.longitude = self.userLocation.coordinate.longitude; 

     CLLocationDistance visibleDistance = 5000; // 5 kilometers 
     MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance); 


     [_mapView setRegion:adjustedRegion animated:YES]; 
    } else { //if a city was selected, use that city's value...this is actually the same right now, since self.userLocation is set appropriately elsewhere. 
     //Set location from selection - forward geocode 
     zoomLocation.latitude = self.userLocation.coordinate.latitude; 
     zoomLocation.longitude = self.userLocation.coordinate.longitude; 

     CLLocationDistance visibleDistance = 5000; // 5 kilometers 
     MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance); 

     [_mapView setRegion:adjustedRegion animated:YES]; 
    } 
} 

초기 탭은 사용자 선호도에 대한 tableviewcontroller이며, 두 번째 탭은지도보기이고 제가있는 TableView이다. 처음지도보기를 탭하면지도 전체가 표시됩니다. 초기 탭 또는 목록 탭으로 다시 돌아가서지도보기로 돌아 가면지도가 현재 위치 주변에 제대로 배치됩니다.

왜 이런 일이 발생합니까?

답변

0

지도보기에서 showsUserLocation을 설정하면 사용자의 위치를 ​​검색하기 시작합니다. 이는 비동기식 작업이며 showsUserLocation을 YES로 설정 한 직후 mapView.userLocation이 유효하다고 가정 할 수 없습니다.

처음 볼 때지도보기에서 위치를 시작하도록 요청합니다. mapView.userLocation은 아마도 nil을 리턴합니다. 두 번째로, 맵보기는 최종 사용자 위치를 얻었으며 맵 영역을 성공적으로로드했습니다. 이것은 투박한 행운이며, 두 번째로 위치를 얻는 것에 의존해서는 안됩니다 (실패 할 수도 평소보다 오래 걸림).

지도보기에서 사용자 위치를 결정하면 위임 방법 (MKMapViewDelegate)이 다시 호출됩니다. 다음과 같이이 위임 메서드를 구현해야합니다.

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    // We have location, do your logic of setting the map region here. 
    ... 
} 

희망이 있습니다.

관련 문제