Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

objective-c MKMapView center on user location

I'm trying to zoom into the user location as the center reference for the screen. I have this code:

MainViewController.h

#import <UIKit/UIKit.h> #import "FlipsideViewController.h" #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocation.h>  IBOutlet MKMapView *mapView;  @interface MainViewController : UIViewController <FlipsideViewControllerDelegate, MKMapViewDelegate> {    MKMapView *mapView; } @property (nonatomic, retain) IBOutlet MKMapView *mapView; 

MainViewController.m

@implementation MainViewController @synthesize mapView;   - (void)viewDidLoad {     [super viewDidLoad];     mapView = [[MKMapView alloc]            initWithFrame:self.view.bounds            ];     mapView.showsUserLocation = YES;     mapView.mapType = MKMapTypeHybrid;     mapView.delegate = self;     [self.view addSubview:mapView]; }  - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {     MKCoordinateRegion region;     MKCoordinateSpan span;     span.latitudeDelta = 0.005;     span.longitudeDelta = 0.005;     CLLocationCoordinate2D location;     location.latitude = userLocation.coordinate.latitude;     location.longitude = userLocation.coordinate.longitude;     region.span = span;     region.center = location;     [mapView setRegion:region animated:YES];  } 

Now I'm only getting a build warning on the last line [mapView setRegion:region animated:YES] stating: 'local declaration of 'mapView' hides instance variable'

like image 227
sadmicrowave Avatar asked May 29 '11 19:05

sadmicrowave


2 Answers

When you do mapView.showsUserLocation = YES;, you ask it to retrieve the user location. This doesn't happen instantly. As it takes time, the map view notifies its delegate that a user location is available via the delegate method mapView:didUpdateUserLocation. So you should adopt the MKMapViewDelegate protocol and implement that method. You should move all your zooming-in code to this method.

Setting the delegate

- (void)viewDidLoad {     [super viewDidLoad];     mapView = [[MKMapView alloc]            initWithFrame:CGRectMake(0,                                      0,                                     self.view.bounds.size.width,                                      self.view.bounds.size.height)            ];     mapView.showsUserLocation = YES;     mapView.mapType = MKMapTypeHybrid;     mapView.delegate = self;     [self.view addSubview:mapView]; } 

Updated delegate method

- (void)mapView:(MKMapView *)aMapView didUpdateUserLocation:(MKUserLocation *)aUserLocation {     MKCoordinateRegion region;     MKCoordinateSpan span;     span.latitudeDelta = 0.005;     span.longitudeDelta = 0.005;     CLLocationCoordinate2D location;     location.latitude = aUserLocation.coordinate.latitude;     location.longitude = aUserLocation.coordinate.longitude;     region.span = span;     region.center = location;     [aMapView setRegion:region animated:YES]; } 
like image 167
Deepak Danduprolu Avatar answered Sep 18 '22 09:09

Deepak Danduprolu


In your interface you forgot to inherit MapViewDelegate -

#import <MapKit/MapKit.h>  @interface MainViewController : UIViewController <FlipsideViewControllerDelegate, MKMapViewDelegate>  {    MKMapView *mapView; } @property (nonatomic, retain) IBOutlet MKMapView *mapView; 

Rest seems fine.

like image 43
Srikar Appalaraju Avatar answered Sep 19 '22 09:09

Srikar Appalaraju