regionThatFits удваивает площадь пролета

Я работаю над компонентом с помощью MKMapView. Карта должна увеличиваться вдвое при нажатии на аннотацию. Для этого я стараюсь вдвое уменьшить диапазон области карты, но иногда это работает некорректно: Вот мир кода:

    MKCoordinateSpan newSpan = mapView.region.span;
NSLog(@"old: %f, %f", newSpan.latitudeDelta, newSpan.longitudeDelta);
newSpan = MKCoordinateSpanMake(newSpan.latitudeDelta / 2.0, newSpan.longitudeDelta / 2.0);
NSLog(@"new: %f, %f", newSpan.latitudeDelta, newSpan.longitudeDelta);
MKCoordinateRegion region = [mapView regionThatFits:MKCoordinateRegionMake(centerCoordinate, newSpan)];

NSLog(@"!!!! (%f, %f) (%f, %f)", region.center.latitude, region.center.longitude, region.span.latitudeDelta, region.span.longitudeDelta);

Беру текущий промежуток, уменьшаю его и перехожу к regionThatFits. Иногда результаты бывают:

old: 0.609257, 0.914612
new: 0.304629, 0.457306
!!!! (55.805472, 37.579371) (0.608178, 0.914612)

regionThatFits удваивает переданный диапазон. Таким образом, визуальный эффект - это центрирование аннотации вида без масштабирования.

Какие-либо предложения?


person HighFlyer    schedule 12.07.2012    source источник


Ответы (2)


Вы не должны использовать regionThatFits:, потому что он используется для изменения значения диапазона в соответствии с рамкой просмотра. Из документа Apple:

Область, центр которой по-прежнему находится в той же точке карты, но значения диапазона скорректированы так, чтобы соответствовать рамке вида карты.

В вашем случае вы можете просто изменить значение диапазона области карты напрямую.

[mapView setRegion:MKCoordinateRegionMake(centerCoordinate, newSpan)];
person FKDev    schedule 12.07.2012
comment
К сожалению, это не помогает. Проблема в том, что код работает нормально почти все время (диапазон не уменьшается), но иногда такое поведение случается. - person HighFlyer; 12.07.2012
comment
Что ж, в iOS 5.x и ранее setRegion привязывается к сетке: stackoverflow.com/questions/3612007/. Посмотрите сессию 300 WWDC 2012, около 5:00, и вы увидите, что есть надежда на будущее setRegion. - person FKDev; 29.07.2012

У меня была такая же проблема, и случилось так, что я иногда менял размер mapView (для нужд приложения). Затем я использовал regionThatFits в моем mapView, когда его высота была 0.

Как говорится в ответе FKDev, regionThatFits пересчитывает диапазон в соответствии с фактическим фреймом mapView (что вызвало сбой). Надеюсь, что это может кому-то помочь.

person aiwis31    schedule 28.04.2015