Я исправил эту проблему с помощью логического значения, которое отслеживает изменения области / центра, вызванные кодом.Не самое элегантное решение, но оно работает как шарм.Жаль, что UIMapView не является производным от UIScrollView.
init:
regionChangeFromCode = FALSE;
Действие кнопки:
-(IBAction) butCenterPressed:(id)sender
{
butCenter.selected = !butCenter.selected;
if(butCenter.selected)
[self setCenter];
}
Установить центр:
-(void) setCenter
{
regionChangeFromCode = TRUE; //before setCenterCoordinate, otherwise this is FALSE in regionWillChangeAnimated
[theMap setCenterCoordinate:[self calcCenter]]; //this could also be [theMap setRegion]. Works the same
}
и делегат карты:
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
if(!regionChangeFromCode) //so a user did it
{
if(butCenter.selected)
butCenter.selected = FALSE;
}
regionChangeFromCode = FALSE;
}
В дополнение к этому у меня есть цикл обновления, который обновляет местоположение и вызывает setCenter.При нажатии кнопки следует центр карты, в противном случае центр остается один.