2011-07-13 10 views
1

マップの注釈をユーザーの現在の場所に設定しようとしています。私はこの方法iOSコアの場所の設定viewDidLoadのユーザーの位置に固定する

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

は、緯度と長いが0.000000あり、まだ呼び出されていないがために、viewDidLoadメソッドでピンを設定しようとしています。私のviewDidLoadまたはアプリケーションが読み込まれるときに私の最初の場所にピンを表示する他のソリューションでこのメソッドを呼び出す方法はありますか?

UPDATE、追加された注釈コード

CLLocationCoordinate2D theCoordinate; 
theCoordinate.latitude = (_currentLocation.latitude); 
    theCoordinate.longitude = (_currentLocation.longitude); 
    NSLog(@"The Coordinate Value:"); 
    NSLog(@"%f, %f",theCoordinate.latitude,theCoordinate.longitude); 

    DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease]; 
    annotation.title = @"Drag to Move Pin"; 
    annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude]; 

    [self.mapView addAnnotation:annotation]; 

それでもUPDATE 2 動作しない、コードがであるdidUpdateLocation方法私は手動で呼び出す方法を発見したことがありません

static BOOL annotationAdded = NO; 

if (!annotationAdded) { 
    annotationAdded = YES; 
     CLLocationCoordinate2D theCoordinate; 
     theCoordinate.latitude = _currentLocation.latitude; 
     theCoordinate.longitude = _currentLocation.longitude; 
     //Sets Initial Point to Africa Because Method to obtain current Location 
     //Hasen't Fired when View Loads 
     theCoordinate.latitude = (mapView.userLocation.coordinate.latitude); 
     theCoordinate.longitude = (mapView.userLocation.coordinate.longitude); 
     NSLog(@"The Coordinate Value:"); 
     NSLog(@"%f, %f",theCoordinate.latitude,theCoordinate.longitude); 

     DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease]; 
     annotation.title = @"Drag to Move Pin"; 
     annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude]; 

     [self.mapView addAnnotation:annotation]; 
} 
+0

まだ動作しないようです。 – rich

答えて

3

MKMapViewは、mapView.showsUserLocation = YESを設定すると、クラスMKUserLocationの注釈を自動的に配置します。

あなたはmapView:viewForAnnotation:でこれを行うことにより、好きなデフォルトの注釈ビューにこの注釈のデフォルトのビューを置き換えることができます:あなたがしたいすべてがある場合

- (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { 
    if ([annotation isKindOfClass:[MKUserLocation class]]) { 
     // replace the following with code to generate and return custom user position annotation view 
     return customAnnotationView; 
    } 

    //*** other code ***// 
} 

更新ビューがロードされたときにユーザーの位置に最初に(一度)ピンを設定すると、時間がかかるので、必要なデータを携帯電話が取得できるまで待たなければなりません。 mapView:didUpdateUserLocationにそれが呼び出された最初の時間をあなたの注釈を追加し、それはトリックを行う必要があります。

- (void) mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    static BOOL annotationAdded = NO; 

    if (!annotationAdded) { 
     annotationAdded = YES; 
     //*** add annotation to mapView ***// 
    } 
} 

最終コメント:私は、一般的に、ユーザーの場所で静的ピンを設定しないでしょう

最初にこのメソッドが呼び出され、代わりに既定の標準の青い点を使用することを選択します。これは、電話機内の位置情報サービスがユーザーの位置情報を正確に把握するのに時間がかかるためですが、時間の都合上、できるだけ早く位置情報の更新を送信します。これは、最初の位置の更新があまり正確ではない可能性があることを意味しますが、それ以降の更新はずっと正確です。そのため、標準の青い点は、地図上に表示される最初の数分間で位置を頻繁に変更することがあります。

ちょっと注意してください。明らかにあなたがすることはあなたのアプリの目的が何であるかによって決まります。

+1

私はこのすべてに同意し、目標が@ Mattの*** Updateのようにユーザーの場所にピンを追加することだと指摘します***セクションでは、位置の 'horizo​​ntalAccuracy'プロパティを見て、正確さがあなたの要求を満たすまで注釈を追加するのを待って、***最終コメント***からの懸念を緩和することができます。 – Caleb

+0

それは私がそれを考慮しなかった良い点です。 – Matt

0

その方法。私はそれが完全に受動的な委任方法だと信じています。ごめんなさい。

+0

ありがとうと思います。 – rich

0

デバイスが場所を特定するまでに時間がかかります。-locationManager:didUpdateToLocation:あなた自身を呼び出して、プロセスをスピードアップすることはできません。マップにユーザーの場所を描画させるためには、@ Mattの提案を使用するか、そうでなければ-... didUpdateToLocation:を呼び出してアクションを実行する必要があります。

+0

あなたdidUpdateLocationを待つ方法についてのコードを表示して、ピンを落とすことができますか? – rich

+1

'-locationManager:didUpdateToLocation:'は、*あなたのロケーションマネージャデリゲートで実装しているメソッドです。特殊なコードは必要ありません。単に '-viewDidLoad'で実行したいコードを取り出し、' didUpdateToLocation: 'に追加してください。あるいは、それを別のメソッドに入れ、 'didUpdateToLocation:'から呼び出す。毎回ではなく最初に場所を取得するときにのみ実行することをお勧めします。そのような場合は、フラグを使用してコードが以前に実行されたかどうかを判断します。 – Caleb

+0

確かに。私はこれについてもっと具体的に私の答えを更新しました。 – Matt