Как правильно сместить MKMapRect

Я должен показать MKMapRoute на MKMapView, и он должен быть показан в определенном регионе на моей карте, не в центре, а в верхней области. Он должен быть помещен в "рамку" высотой около 80 точек.

Я думал, что смогу достичь этого с помощью метода MKMapView

- (MKMapRect)mapRectThatFits:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets

но я сталкиваюсь с некоторыми странностями. Точно, если я использую этот фрагмент кода:

//obj is the returned mkroute object.
MKRoute *rout = obj;        
MKPolyline *line = [rout polyline];
MKMapRect boundingMapRect = [line boundingMapRect];
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect] 
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
MKCoordinateRegion r = MKCoordinateRegionForMapRect(fittedRect);
[self.mapView setRegion: r animated:YES];

результат виден на следующем скриншоте:

MKMapRect с 100 точками верхней вставки

Однако, если я установлю края вставки, чтобы быть (0,0,0,0) изменив четвертую строку моего предыдущего фрагмента с помощью:

MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]  
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];

результат такой:

MKMapRect с нулевой верхней вставкой

Как вы можете ясно видеть, смещение изменилось на 50 (а не 100) точек сверху. Кажется, что все становится еще более странным, когда я играю с разницей в широте и долготе MKMapRegion или меняю экран устройства.

Теперь моя цель состоит в том, чтобы просто сказать mapView нарисовать этот маршрут в кадре, скажем, "64 точки сверху и высотой 80 точек и шириной 320 точек", я не нахожу простой способ сделать это и я боюсь, что что-то упустил. Я не хочу играть, изменяя широту региона, потому что размер контента может варьироваться (может быть, будет показан меньший или больший маршрут). Чего мне не хватает и что может быть простым способом сделать это? почему вкладки не рассчитываются должным образом?

1 ответ

Решение

Указывая только верхний отступ, представление карты пытается максимизировать отображаемый размер наложения в оставшемся пространстве, не искажая карту и основываясь на уровнях масштабирования, которые она может представить. Таким образом, вы не приблизитесь к желаемой ширине и высоте, которые вы хотите.

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

Тем не менее, вид карты все равно будет корректировать фактически отображаемую область на основе того, что он может представить, не искажая карту и т. Д., Но результат должен быть ближе к тому, что вы хотите.

Основываясь на этом предложении в вашем последнем абзаце:

Моя цель состоит в том, чтобы просто сказать mapView нарисовать этот маршрут в кадре, скажем, "64 точки сверху и высотой 80 точек и шириной 320 точек"

Вот пример того, как вы можете приблизиться к этому результату:

MKRoute *rout = obj;        
MKPolyline *line = [rout polyline];

CGFloat desiredDistanceFromTop = 64.0;
CGFloat desiredWidth = 320.0;
CGFloat desiredHeight = 80.0;

CGFloat topPadding = desiredDistanceFromTop;
CGFloat leftPadding = (self.mapView.frame.size.width - desiredWidth) / 2.0;
CGFloat rightPadding = leftPadding;
CGFloat bottomPadding = self.mapView.frame.size.height 
                            - topPadding 
                            - desiredHeight;

UIEdgeInsets edgeInsets = 
    UIEdgeInsetsMake(topPadding, leftPadding, bottomPadding, rightPadding);

[self.mapView setVisibleMapRect:line.boundingMapRect 
                    edgePadding:edgeInsets 
                       animated:YES];

Отдельно обратите внимание, что нет необходимости преобразовывать прямоугольник карты в регион или самостоятельно вычислять "подогнанный" прямоугольник / регион, поскольку:

  • Ты можешь использовать setVisibleMapRect вместо setRegion,
  • И то и другое setVisibleMapRect а также setRegion сами рассчитывают "подогнанный" прямоугольник / регион с учетом запрошенного прямоугольника / региона.
Другие вопросы по тегам