Chandan Kumar Jha
Chandan Kumar Jha

Reputation: 325

How to show user on Map using mapkit in IOS

How to show user on Map using mapkit in IOS. This code only show the India on the map instead of coordinates defined.

    mapView.delegate = self;
    mapView.showsUserLocation = YES;
    objLocationManager = [[CLLocationManager alloc] init];
    objLocationManager.distanceFilter = kCLDistanceFilterNone;
    objLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    objLocationManager.delegate = self;
    #ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER) {
        // Use one or the other, not both. Depending on what you put in info.plist
        //[objLocationManager requestWhenInUseAuthorization];
        [objLocationManager requestAlwaysAuthorization];
    }
    #endif
   [objLocationManager startUpdatingLocation];

    mapView.showsUserLocation = YES;
    [mapView setMapType:MKMapTypeStandard];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
     mapView.delegate=self;

Upvotes: 0

Views: 692

Answers (2)

Devang Tandel
Devang Tandel

Reputation: 3008

You are starting Location Updates and you will get your current location through it. But how will MKMapview know about the Location Changes?

For MKMap View to adopt Location changes you have to set delegate to MKMapview. That part you have done already, but you forgot the delegate method:

- (void)mapView:(MKMapView *)aMapView didUpdateUserLocation:(MKUserLocation *)aUserLocation {}

This delegate method will send your current location to MapView. That is all you need.

If you want to use the default Delegate method, then you have to place marker on map with a current coordinate received from CLLocation's Update Method.

If you are going to use default delegate method then don't forget to confirm MKMapViewDelegate.

Let us know if it works. I am sure it will. Have a good day.

Upvotes: 1

Tej Patel
Tej Patel

Reputation: 119

Step: 1 - Import

import MapKit
import CoreLocation

Step: 2 - Add Delegate

MKMapViewDelegate,CLLocationManagerDelegate

Step: 3 - Declare

@IBOutlet var mapView: MKMapView!
var locationManager = CLLocationManager()
var myLocation = CLLocation()

Step: 4 - Inside ViewDidLoad

locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled()
    {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.distanceFilter = kCLDistanceFilterNone
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
    }

//MARK: - MapView and Location Manager -
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
    self.myLocation = locations.last!
    print("NewLocation \(locations[0].coordinate.latitude) \(locations[0].coordinate.longitude)")
}

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
    let annotationIdentifier = "AnnotationIdentifier"
    var annotationView: MKAnnotationView?
    if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) {
        annotationView = dequeuedAnnotationView
        annotationView?.annotation = annotation
    }
    else
    {
        let av = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
        av.rightCalloutAccessoryView = UIButton(type: .roundedRect)
        annotationView = av
    }

    if let annotationView = annotationView
    {
        annotationView.canShowCallout = true
        annotationView.image = UIImage(named: "Location")
    }
    return annotationView
}

self.mapView.showsUserLocation = true

 let geoCoder = CLGeocoder()
                        geoCoder.geocodeAddressString(address!) { (placemarks, error) in
                            guard
                                let placemarks = placemarks,
                                let location = placemarks.first?.location
                                else
                            {
                                return
                            }

                            let newPin = MKPointAnnotation()
                            let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
                            let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
                            self.mapView.setRegion(region, animated: true)

                            newPin.title = address
                            newPin.coordinate = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
                            self.mapView.addAnnotation(newPin)
                        }

@IBAction func btnDirection(_ sender: Any)
{
    let address = self.dictEventDetails.object(forKey: "address") as? String
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(address!) { (placemarks, error) in
        guard
            let placemarks = placemarks,
            let location = placemarks.first?.location
            else
        {
            return
        }
        let coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinate, addressDictionary:nil))
        mapItem.name = address
        mapItem.openInMaps(launchOptions:nil)
    }
}

Upvotes: 0

Related Questions