2010-11-10 71 views
0

好的,我試圖獲得當您點擊當前位置按鈕時iPhone地圖應用程序具有的相同放大/位置更新功能。我正在使用從herehere(Brad Smith發佈的代碼)中找到的代碼來完成大部分工作。所以我真正需要做的就是圍繞更新的當前位置對地圖進行中心化,並在每次更新時進一步放大。在iPhone上更新/縮放到當前位置

現在我在測試centerCoord是否爲null時遇到了一些困難。正如你從結果(下面列出)中看到的那樣,由於某些原因我崩潰了。下面是相關代碼:

- (void) showCurrentLocationButtonTapped { 
    NSLog(@"Showing current location."); 

    locController = [[LocationController alloc] init]; 

    [mapView setShowsUserLocation:YES]; 

    zoomTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(zoomToCurrentLocation) userInfo:nil repeats:YES]; 

} 

- (void) zoomToCurrentLocation { 
    CLLocationCoordinate2D centerCoord = self.locController.currentLocation.coordinate; 
    NSLog(@"Checking if loc controller is null"); 
    if (!self.locController) { 
     NSLog(@"centerCoord is null!"); 
    } 
    NSLog(@"centerCoord: %@",centerCoord); 
    [mapView setCenterCoordinate:centerCoord zoomLevel:7 animated:YES]; 
} 

這裏是控制檯輸出:

2010-11-10 14:56:11.002 App Name[5278:207] Showing current location. 
2010-11-10 14:56:11.504 App Name[5278:207] Checking if loc controller is null 
2010-11-10 14:56:11.505 App Name[5278:207] centerCoord: (null) 
2010-11-10 14:56:12.004 App Name[5278:207] Checking if loc controller is null 
2010-11-10 14:56:12.004 App Name[5278:207] centerCoord: (null) 
2010-11-10 14:56:12.504 App Name[5278:207] Checking if loc controller is null 

我知道我沒有測試的centerCoord的空湖,但如果我這樣做:

if (!centerCoord) { 

我得到該線路上的錯誤說:

MapViewController.m:55: error: wrong type argument to unary exclamation mark 

回答

0

也許位置控制器正在花時間更新您的位置。
嘗試將您的計時器設置爲30秒,看看會發生什麼。

+0

我做5秒而不是30 ,因爲30太長了。小藍點出現在縮小的地圖上。 5秒後,它崩潰。這裏是控制檯輸出:2010-11-10 17:24:09.507應用名稱[5731:207]顯示當前位置。 Wed Nov 10 17:24:10 ...:CGImageCreateWithImageProvider:無效的圖像大小:0 x 0. 2010-11-10 17:24:14.509應用名稱[5731:207]檢查loc控制器是否爲空 – Stunner 2010-11-11 01:25:51

+0

MapViewController。 m:55:錯誤:對一元感嘆號的錯誤類型參數表示您不能對此使用感嘆號。嘗試CLLocationCoordinate2DIsValid(centerCoord)。 – pasine 2010-11-19 19:39:15

2

這裏有您需要做什麼:

首先,檢查是否啓用了位置服務:

在findUserLocation方法
if ([CLLocationManager locationServicesEnabled]) 
    [self findUserLocation]; 

然後,實例化CLLocationManager,並開始接收更新:

- (void)findUserLocation 
{ 
    CLLocationManager *locationManager_ = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracy{ChooseYourOptionHere}; 
    [locationManager startUpdatingLocation]; 
} 

最後,實現這個委託方法,每次收到更新時都會調用它。檢查當前位置的精確度對您所需的精度(以上設置),在地圖中心,如果你喜歡它,不要忘了從接收更新停止外景經理:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    if ([newLocation horizontalAccuracy] < [manager desiredAccuracy]) 
    { 
     // Accuracy is good enough, zoom to current location 
     [manager stopUpdatingLocation]; 
    } 
// else keep trying... 
} 
+0

我剛剛意識到這是6個月大,不知道爲什麼它又被撞到了頂端? – Rog 2011-03-22 07:50:13

+0

我不知道,嘿。感謝您的答案,但我會回到我的項目的這一部分,並按照您的建議做,如果它幫助我做我正在尋找的東西,我一定會接受您的答案。 :)你從我這裏得到了+1來回答這個問題。 – Stunner 2011-03-23 06:23:54