Just a note to say the solution above doesn't really change the mapcenter, just shifts the map view and displays a point at the bottom. For example, if you use the code above and are updating the map view based on the device heading, when you rotate the device, the rotation is NOT around the adjusted center (at the bottom of the view)...it is still around the middle of the view, which is the center of the device. An annotated pin (at the bottom of the view) then floats around the map view on a radius equidistant from the new center, and may disappear from view (as screen width < height).
To resolve this, set constraints so the mapview is pinned to the top layout guide, then add a constraint to the mapview based on the device screen resolution that matches the screen width, and for height, offsets the map BELOW the main view (for example, set the height of map view at 1.7 times larger than the screen) In Swift 4:
let screenSize = UIScreen.main.bounds
let screenWidth = screenSize.width
let screenHeight = screenSize.height*1.7
let widthConstraint = NSLayoutConstraint(item: self.yourMapView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: screenWidth)
self.yourMapView.addConstraint(widthConstraint)
let heightConstraint = NSLayoutConstraint(item: self.yourMapView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: screenHeight)
self.yourMapView.addConstraint(heightConstraint)