Как правильно сместить 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];
результат виден на следующем скриншоте:
Однако, если я установлю края вставки, чтобы быть (0,0,0,0)
изменив четвертую строку моего предыдущего фрагмента с помощью:
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]
edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
результат такой:
Как вы можете ясно видеть, смещение изменилось на 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
сами рассчитывают "подогнанный" прямоугольник / регион с учетом запрошенного прямоугольника / региона.