2011-09-23 8 views
11

MKMapViewについて投稿された多くのものとは反対の問題があるようです。ズームして現在の位置を表示することができないのではなく、に停止するようにすることはできません。そうすることです。ここでは何が起こるかです:私はアプリを起動MKMapViewが継続的にズームしてユーザの位置に戻すのを防ぐ

  • MKMapViewは
  • は、私は私の指数秒後
  • 、MKMapViewを使用して地図上の距離ズームアウトや青い点で私の場所を示してい突然MKMapViewはを使用する方法を知っているので、私は、私のCLLocationManagerstopUpdatingLocationへの影響を語っていない試みた再び

私の現在の位置にセンターに戻って拡大表示されます)、私はMKMapViewsetShowsUserLocation:NOと言ってみました(青い点はまったく表示されませんが、これは私が望むものではありません)。私もCLLocationManager(効果なし)を削除しようとしました。これを引き起こしていると私はどのようにそれを停止するのですか?


はい、ロケーションマネージャの精度と距離を-loadViewに設定しています。

-mapViewDidFinishLoadingMap:を実装していません。

- (void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)u 
{ 
    CLLocationCoordinate2D loc = [u coordinate]; 
    // Display the region 500 meters square around the current location 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 500, 500); 
    [mv setRegion:region animated:YES]; 
} 
+0

ここで、センタリングは行っていますか? 'mapView:didUpdateUserLocation:'で?あなたはそのコードを投稿できますか? – Anna

+0

didUpdateUserLocationメソッドは、ユーザーの場所が変更されるか、新しい読み取り値が取得されるたびに呼び出されます。メソッドでチェック/設定できるbool ivarを追加すると、u.location.horizo​​ntalAccuracyまたはu.location.timestampに基づいて条件付きでセンタリングすることができるように、1回だけセンタリングが行われます。 – Anna

+0

これは意味がありますが、私は今、-mapView:didUpdateUserLocationを持っています:u.location.horizo​​ntalAccuracyがlocationManager.desiredAccuracyであれば条件付きでセンタリングしており、まだ起きています。条件を逆にすると、私は初期ズームを取得しません。 – DJHoward

答えて

0

まず、私は、これは多くの物事に影響することを知らない、しかし、実行します。ここで私は、これはあなたが@Annaカレーニナ、を中心求めていると思う

-locationManager:didUpdateToLocation:fromLocation: 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    // How many seconds ago was this new location created? 
    NSTimeInterval t = [[newLocation timestamp] timeIntervalSinceNow]; 

    // CLLocationManagers will return the last found location of the device first, 
    // you don't want that data in this case. If this location was made more than 3 
    // minutes ago, ignore it. 
    if (t < -180) 
    { 
     // This is cached data, you don't want it, keep looking 
     return; 
    } 

    [locationManager stopUpdatingLocation]; 
} 

の私の実装です(あなたはlocationManager実装しているどこか)あなたがすべてでviewDidLoadであなたの場所のマネージャーの精度と距離フィルタを設定します。

[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locationManager setDistanceFilter:kCLDistanceFilterNone]; 

第二に、yのこれらの2つの機能をチェックわれわれの情報源(それだけで説明のためであると使用を表示するために、私はここに記載されている実際の機能の内容を無視)し、可能であれば私たちはより良い支援することができますので、これらの機能のためにコードを提供します。

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    [activityIndicator stopAnimating]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSDate* eventDate = newLocation.timestamp; 
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; 
    if (abs(howRecent) < 15.0) 
    { 
     NSLog(@"New Latitude %+.6f, Longitude %+.6f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 
    } 
} 
4

を​​メソッドを実装しないでください。

代わりにlocationmanager didUpdateToLocationを使用してください。

didUpdateUserLocation理由がなく何度も呼び出されます。場所が変更されたときにはdidUpdateToLocationが呼び出されます。

次に、didUpdateToLocationメソッドでmkmapview領域を手動で設定できます。

0

MKMapViewDelegateメソッドでdispatch_onceを使用して、最初に1回だけズームします。ここにコードがあります。

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {  
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     CLLocationCoordinate2D newCoordinate = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude); 

     MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newCoordinate, 500, 500); 
     [mapView setRegion:region animated:YES]; 
    }); 
} 
関連する問題