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'
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]; }
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With