siddle
siddle

Reputation: 137

Zoom with animation in current location when map loads in IOS

I have used map in my view controller but when the maps loads it shows me view of the whole country. I want to show my current location view when maps loads, for that I have used didUpdateUserLocation method and set delegate for it.

My code is this:

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
   [self.mapView setRegion:MKCoordinateRegionMake(_userLocation.coordinate, MKCoordinateSpanMake(0.1f, 0.1f)) animated:YES];
}

Now when my map loads it animate and zoom but in wrong location. It is taking me to any location in sea when map loads , but my current location is different.

I have also tested it in real device but it does not show my location.

The maps looks like that when loads:

enter image description here

ViewController class code:

@property BOOL updateUserLocation;
@property(strong,nonatomic) CLLocation *userLocation;

@property (nonatomic, retain) MKPolyline *routeLine;

@property (nonatomic, retain) MKPolylineView *routeLineView;

@property (nonatomic,retain) NSString *latitude;

@property (nonatomic,retain) NSString *longitude;
- (void)viewDidLoad {
[super viewDidLoad];
 [[self navigationController] setNavigationBarHidden:YES animated:YES];
_AlertView.hidden=YES;
_distanceView.hidden=YES;
self.mapView.zoomEnabled=YES;

locationManager = [[CLLocationManager alloc]init];
locationManager.delegate = self;
[locationManager startUpdatingLocation];

[self.mapView setShowsUserLocation:YES];
[self.mapView setDelegate:self];

}

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
[self.mapView setRegion:MKCoordinateRegionMake(_userLocation.coordinate, MKCoordinateSpanMake(0.1f, 0.1f)) animated:YES];
}

Upvotes: 1

Views: 945

Answers (3)

Kerberos
Kerberos

Reputation: 4166

Add these lines in the viewDidLoad:

self.mapView.showsUserLocation = YES;

if you want to center the map to the user location add this:

[self.mapView setCenterCoordinate:mapView.userLocation.location.coordinate animated:YES];

EDIT:

ViewController example:

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLLocation *location;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[self mapView] setShowsUserLocation:YES];

    self.locationManager = [[CLLocationManager alloc] init];

    // we have to setup the location manager with permission in later iOS versions
    if ([[self locationManager] respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [[self locationManager] requestWhenInUseAuthorization];
    }

    [[self locationManager] setDelegate:self];
    [[self locationManager] setDesiredAccuracy:kCLLocationAccuracyBest];
    [[self locationManager] startUpdatingLocation];
}

-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    // Stop updating location, when you want to restart update use [[self locationManager] startUpdatingLocation];
    [manager stopUpdatingLocation];

    self.location = locations.lastObject;

    // zoom the map into the users current location
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance
        (self.location.coordinate, 2, 2);
    [[self mapView] setRegion:viewRegion animated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

I've only added the IBOutlet on the storyboard and the NSLocationWhenInUseUsageDescription key in the plist.

If you change the location on the simulator you can see the maps change location.

If you want I can upload the complete example project.

NEW EDIT:

There is an error in you code!

When you use [self.mapView setRegion:MKCoordinateRegionMake(_userLocation.coordinate, MKCoordinateSpanMake(0.1f, 0.1f)) animated:YES], you use _userLocation that is your CLLocation variable! You must use userLocation that is the value that you receive from the method.

I recommend you to change the CCLocation variable name and use the userLocation name only for the variable used in the didUpdateUserLocation method.

Upvotes: 1

Kosuke Ogawa
Kosuke Ogawa

Reputation: 7451

Use didUpdateToLocation instead of didUpdateUserLocation.

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    [self.locationManager stopUpdatingLocation];

    MKCoordinateRegion region;
    region.span.latitudeDelta = 0.005;
    region.span.longitudeDelta = 0.005;
    region.center.latitude = newLocation.coordinate.latitude;
    region.center.longitude = newLocation.coordinate.longitude;
    [self.mapView setRegion:region animated:YES];
}

See also my library.

https://github.com/koogawa/KGWLocationPicker/blob/master/KGWLocationPicker/KGWLocationPickerViewController.m

Upvotes: 0

Muhammad Salman
Muhammad Salman

Reputation: 553

You can call this method and zoom on map

 CLLocationCoordinate2D zoomLocation;
    zoomLocation.latitude = ; // your latitude value
        zoomLocation.longitude=  // your longitude value
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    span.latitudeDelta=0.18; // change as per your zoom level
    span.longitudeDelta=0.18;
    region.span=span;
    region.center= zoomLocation;
    [mapview setRegion:region animated:TRUE];
    [mapview regionThatFits:region];

Upvotes: 1

Related Questions