19

私のアプリは、現在のユーザーの位置 (CoreLocation.framework) を認識しています。ユーザーが新しい MapView を開くとすぐに、iPhone は現在位置の検索を再開します。それをスキップしたり、mkMapView の最初のユーザー位置を変更したりすることは可能ですか?

編集:

MKMapView を上書きして、別の LocationManager を使用することは可能ですか?

4

4 に答える 4

42

はい、別のロケーション マネージャー オブジェクトを作成し、その値をマップ ビューに割り当てることができます (ところで、SO コード フォーマッターが機能しなくなるのを防ぐために、リスト プレフィックスとして以下の「=」を使用しています)。

=あなたUIViewControllerは2つの別々のプロパティを維持しています.1つはaにMKMapView、もう1つはaにCLLocationManager

MKMapView=およびその他の必要なウィンドウ クロムを含むXIB ファイルを作成します。アウトレットをコントローラーのプロパティに接続します。MKMapViewユーザーの場所を追跡しないようにしてください。

= UIViewController にCLLocationManagerDelegateプロトコルを実装させます。特に、locationManager:didUpdateToLocation:fromLocation:新しい場所の値が利用可能になるたびに呼び出されるメソッドです。コントローラーをロケーション マネージャーのデリゲートとして設定します。

= viewController のloadViewメソッドで、NIB をロードしMKMapViewます。ユーザー フィードバックを提供するには、UIActivityIndicatorViewスピナーを設置して に設定するとよいでしょうstartAnimating。次に、次から始めます。

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];

=locationManager:didUpdateToLocation:fromLocation:最後の N 秒以降にイベントが更新されたかどうかを確認します。次に、ロケーション マネージャーに更新を停止するように指示し、スピナーにアニメーションを停止するように指示します。緯度/経度データを取得し、それをビュー スパンとリージョンと共にマップ ビューに割り当てて、適切な場所にズームして中央に配置します。

= ここがトリッキーな部分です: 青い大理石の「スロバー」は、ユーザーの位置を追跡するマップビューの機能です。本物のマーカーが作動するまで、一時的に「偽装」する必要があります (または、現在の場所に別のマーカーを使用して、その位置を自分で維持するだけです)。個人的には使い慣れた青い大理石がいいと思います。

= 起動時にすぐに表示されるようにするには、場所マネージャーによって返された場所に追加された青い大理石のグラフィックだけでカスタム MKAnnotationView を作成する必要があります。これは、場所が表示された Mapview のスナップショットを撮り、青い大理石だけをフォトショッピングして、カスタム注釈ビューの画像として使用することを意味します。

= マップをアクティブに追跡する場合は、マップビューのユーザー位置追跡を有効にし、実際のデータを取得したら、以前に設定したマーカーを非表示にして、マップビューに更新を行わせることができます。もう 1 つのオプションは、既存のロケーション マネージャーが約 1 秒ごとに更新を受信し続け、青い大理石の注釈の位置を自分で更新できるようにすることです。

= mapview 自身の userLocation に viewDidLoad への追加の更新を行わせるには:

[self.map.userLocation addObserver:self 
forKeyPath:@"location" 
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) 
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location

=実装しobserveValueForKeyPathます。locationmapview の属性にuserlocation値がある場合に呼び出されます。

-(void)observeValueForKeyPath:(NSString *)keyPath 
      ofObject:(id)object 
        change:(NSDictionary *)change 
       context:(void *)context 
{
     if ([self.map isUserLocationVisible]) {
         [self.locationManager stopUpdatingLocation];
         self.ownBlueMarble.hidden = YES;
     }
     // The current location is in self.map.userLocation.coordinate
}

= 現在の位置を表示する際のウォームアップの遅延を回避するには、マップと位置マネージャーを含む viewController への参照を保持して、それが消えないようにします (少しメモリを消費しますが、解放すると、 MapView がタイルをロードして準備が整うまで待機します)。

= ではviewWillLoad、最後の既知の場所をカスタム bluemarble 注釈に詰め込んで表示できます。userLocation 追跡のオン/オフを切り替えます。通知を受け取ると、同じ注釈を非表示にして実際の大理石を表示するトリックが機能します。マップビュー独自のロケーション マネージャーが作動し、データがあれば、注釈マーカーを非表示にすることができます。

= viewController のviewWillDisappearメソッドを実装し、mapview の追跡を手動でオフuserLocationにして、次にビューが表示されたときにデフォルトでオフになるようにすることもできます。また、最後の既知のものを取得しuserLocationて、次の開始のために保存することもできます。そうすれば、viewWillAppearメソッド内ですべての位置決めマーカー ジャグリングを実行でき、準備が整うまで userLocation の干渉を心配する必要はありません。

幸運を。

于 2009-09-30T03:35:43.850 に答える
27

コントローラ内:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    CLLocationCoordinate2D coord = {latitude: 37.423617, longitude: -122.220154};
    MKCoordinateSpan span = {latitudeDelta: 1, longitudeDelta: 1};
    MKCoordinateRegion region = {coord, span};
    [mapView setRegion:region];
}

地図が表示されると、パロアルトの近くの中央に配置されます

于 2009-09-24T07:49:40.463 に答える
0

別のロケーションマネージャーを使用する必要はありません。マップに必要なポイントを追加し、他の必要なロジックを介してそれらを更新できます。

リモートコントロールカーへのソケット接続があり、そのカーがペイロードに地理的位置情報を含むソケットデータを送り返したとします。それを解析して、地図上のサムネイルの位置をリアルタイムで更新することができます。そのために「userLocation」プロパティは必要ありませんが、必要に応じて表示できます。

ユーザーの場所は読み取り専用であり、使用することも使用しないこともできます。それはあなたがする必要があるかもしれない何かをするためにあなたが別のロケーションマネージャーを必要とするという意味ではありません。あなたのアプリは本当にその機能を必要としないようですが、私はあなたの質問を誤解している可能性があります。

于 2009-09-28T18:04:48.990 に答える
0

showUserLocation初期化時にプロパティを false に設定してから、以前のマップ ビューを復元してみてくださいregion(明らかに、以前のマップが破棄される前にこれを保存する必要があります)。

これはあなたが望んでいたものですか?

于 2009-09-25T01:36:14.090 に答える