7

MKMapViewカスタム ビュー (青い点ではない) を使用してユーザーの位置を追跡するはずの があります。このビューを青い点に置き換えるために、次のように返します。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if (annotation == [mapView userLocation])
    {
        return userLocationView;
    }
}

追跡を初期化するために、私は呼び出します

[mapView setShowsUserLocation: YES];
[mapView setUserTrackingMode: MKUserTrackingModeFollow animated: NO];
[mapView setDelegate: self];

予想どおり、-mapView:didUpdateUserLocation:アプリのロード時に 1 回呼び出されます。残念ながら、-mapView:viewForAnnotation:次の実装に変更しない限り、再度呼び出されることはありません。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if (annotation == [mapView userLocation])
    {
        return nil;
    }
}

これらの変更により、マップはユーザーの位置のインジケーターとして青い点をロードし、-mapView:didUpdateUserLocation:予想どおり頻繁に呼び出されます。

ユーザーの場所を追跡し、カスタムのユーザーの場所を表示するためのある種の相互排他性はありますか? どうすれば両方を実現できますか?

ソース

このプロジェクトは、この問題を示しています。https://dl.dropbox.com/u/2338382/MapKitFuckery.zip

バグ

これはおそらくバグであり、レーダーとして報告しました。当面は、受け入れられた回答で十分であることが証明されるはずです。ただし、カスタム アノテーション[mapView userLocation]と.[mapView showsUserLocation]CLLocationManager

4

2 に答える 2

11

マップ ビューの位置の更新に依存する代わりに、 を開始してCLLocationManager設定し、 (iOS 5 以前の場合) または(iOS 6)delegateを待ちます。マップ ビューのデリゲート メソッドを使用するよりも、はるかに信頼性の高い豊富な情報を取得できます。あなたはおそらくこれを行う方法を知っているでしょうが、ここにあります:-locationManager:didUpdateToLocation:fromLocation:-locationManager:didUpdateLocations:

#import <CoreLocation/CoreLocation.h>

- (void)viewWillAppear:(BOOL)animated
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [self.locationManager startUpdatingLocation];
}

// Deprecated in iOS 6
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{

    // Check the age of the newLocation isn't too long ago using newLocation.timestamp

    // Set the map dot using newLocation.coordinate

    // Set an MKCircle to represent accuracy using newLocation.horizontalAccuracy
}

nilあなたが言ったように、mapViewのデリゲートに着信するデリゲート呼び出しを見て、呼び出しを停止する以外のものを返し-mapView:didUpdateUserLocation:ます。以下は着信順のコールです。

 - (void)mapViewWillStartLocatingUser:(MKMapView *)mapView
 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
 - (void)mapViewWillStartLoadingMap:(MKMapView *)mapView
 - (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error

おそらくMKUserLocationオブジェクトではなく、MKMapView更新呼び出しでデリゲートを呼び出す責任があるオブジェクトです。と のステータスを確認するshowsUserLocationmapView.userLocation、どちらも正常に見えます。

NSLog(@"%d %@", mapView.showsUserLocation, mapView.userLocation);

1および nil 以外のオブジェクト ( ) を返します1 <MKUserLocation: 0x1e02e580>。おそらく、オブジェクトにmapViewクエリを実行しuserLocationて現在の場所を取得し、それをデリゲートに送信します。そのオブジェクトがなくなった場合、それは機能しません。

少し奇妙ですが、私が言ったように、CLLocationManagerの更新からより良い更新が得られます。

于 2012-11-14T00:17:38.640 に答える