How to move MKMapView based on selected annotation

Using MKMapViewDelegate method:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

    // center the mapView on the selected pin
    let region = MKCoordinateRegion(center: view.annotation!.coordinate, span: mapView.region.span)
    mapView.setRegion(region, animated: true)
}

You could try getting the MKMapRect from visibleMapRect for the map view, converting the annotation's coordinate to an MKMapPoint, resetting the MKMapRect's origin so the MKMapPoint is in the appropriate position, and then using setVisibleMapRect:animated: to set the visible region to the new MKMapRect.

For example, if you wanted to move the map so the annotation is centered horizontally and 25% of the way down vertically, you could do something like this:

MKMapRect r = [mapView visibleMapRect];
MKMapPoint pt = MKMapPointForCoordinate([annotation coordinate]);
r.origin.x = pt.x - r.size.width * 0.5;
r.origin.y = pt.y - r.size.height * 0.25;
[mapView setVisibleMapRect:r animated:YES]; 

I built it on Swift 4, based on answers here

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

        // center the mapView on the selected pin
        var dest = view.annotation!.coordinate
        if view.annotation?.title == "Name of Annotation View"{//This is for move a little down depending on the MKAnnotationView size
            dest.latitude = dest.latitude + 0.002
        }
        let span = MKCoordinateSpan.init(latitudeDelta: 0.01, longitudeDelta: 0.01)
        let region = MKCoordinateRegion(center: dest, span: span)
        mapView.setRegion(region, animated: true)


    }