I worked this out early this morning.
When I initialize the map view, I shouldn't be setting an Autoresize Mask. Instead I should set:
[mapView setTranslatesAutoresizingMaskIntoConstraints:NO];
It is necessary to set a frame for the map view just once. I opted to set it during its initialization. After that, constraints and VFL take control of its position and dimensions. All errors are gone and it works exactly as I wanted.
For the record, this is the full initialization method:
+ (MKMapView *)sharedMap {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mapView = [[MKMapView alloc] init];
[mapView setFrame:CGRectMake(0, 0, 1, 1)];
// Configure the map view
if (IS_IOS_7) {
[mapView setShowsUserLocation:YES];
[mapView setPitchEnabled:NO];
}
[mapView setTranslatesAutoresizingMaskIntoConstraints:NO];
});
return mapView;
}