2014-09-25 65 views
0

嘿所以我有一個地圖視圖,可以在視圖加載時放大用戶位置。目前,我使用CLLocationManager查找用戶位置,並在didUpdateLocations委託方法中初始化映射。然而,因爲這被稱爲多次,我使用全局BOOL,該地圖設置一次後設置爲true,然後再也不設置它。下面是代碼:MKMapView和放大用戶位置的最佳方式

定義全局BOOL,並在viewDidLoad中設置爲false

@implementation MainMapViewController 
{ 
    BOOL hasInitializedMap; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    hasInitializedMap = NO; 
} 

我然後獲取用戶的位置,並設置地圖的(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations委託方法內放大:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation *location = [locations lastObject]; 

    [self initializeMainMapView:location.coordinate.longitude latitude:location.coordinate.latitude]; 
} 

- (void)initializeMainMapView:(float)longitude latitude:(float)latitude 
{ 
    if (!hasInitializedMap) 
    { 
     CLLocationCoordinate2D zoomLocation; 
     zoomLocation.latitude = latitude; 
     zoomLocation.longitude = longitude; 

     MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 1500, 1500); 
     [mainMapView setRegion:viewRegion animated:YES]; 

     hasInitializedMap = YES; 
    } 
} 

此代碼有效,但讓我想知道是否有更好的方法來做到這一點。我討厭使用這樣的全局標誌,因爲它可能會讓你的代碼感到困惑,並且最好是sl sl不馴。有沒有更好的方法來做我想做的事情?是否有一個委託方法只在用戶位置第一次更新時被調用?我可以用MKMapView做到這一點,並忘記CoreLocation

回答

1

我已經做了幾個方法...實際上框架已經改變了幾次,所以我不記得我是如何解決它的。該MKMapkit確實有用於顯示用戶所在位置,developer doc的方法:

該屬性並不表示用戶的位置是否是實際可見的地圖上,地圖視圖只有是否應嘗試以顯示它。將此屬性設置爲YES會導致地圖視圖使用Core Location框架來查找當前位置並嘗試在地圖上顯示它。只要此屬性爲YES,地圖視圖就會繼續跟蹤用戶的位置並定期更新。此屬性的默認值爲NO。

顯示用戶的位置並不能保證位置在地圖上可見。用戶可能已將地圖滾動到不同的位置,導致當前位置不在屏幕上。要確定用戶的當前位置是否當前顯示在地圖上,請使用userLocationVisible屬性。

用戶的位置將顯示爲註釋。您可以獲取註釋並放大。這將是更好的辦法是使用該標誌與此相關,有一個方法-mapView的MKMapViewDelegate:DidUpdateUserslocation:

delegate documentation

你可以改變地圖的跟蹤模式無法比擬的第一個也許以後(我不確定這是否會刪除用戶位置註釋,如果是這樣,您可以輕鬆地將地圖引腳放在適當的皮膚上)。 -setUserTrakingMode:animated:是MKMap可以使用的方法。

有一件事情我會寫在過去的用戶位置編寫應用程序,它需要幾秒鐘才能得到一個準確的位置。在鎖定位置之前,您可能首先要讓GPS平穩幾次。我發現前幾個滴答可能是瘋狂的不準確。希望有所幫助。

+0

我刪除了locationManager委託並切換到只使用MKMapKit的。感謝您的鏈接,我認爲我已經明白了! – ScottOBot 2014-09-26 00:30:24

+0

太棒了!如果你需要更多的細節讓我知道。我有一個項目在家裏做一些類似的東西,我可以從那裏得到一些確切的代碼。 – 2014-09-26 22:19:22