我有我似乎无法换我的头周围的一个特例。
我有一个全屏幕的MapView作为背景。下半部我有索姆等元素,我需要设置mapregion我的MapView,使所有的注释是可见的,定位在视图的上半部分。
我能找到的所有注释的maprect。我还可以找到上半部分的矩形 - 即使它转换成一个maprect。
但我怎么才能移动(挤)的maprect-是一成不变的注释,到上半这两个maprects关联?
任何人都可以给我这样的暗示?
我有一个类似的设计一次,除非它是一个单一的注释,而不是多,但在原则上其同样的事情。
在ViewDidLayoutSubviews:
你需要弄清楚什么区域包含您的注释(并不难只要找到最大和最小纬度,经度和添加填充)。下面是它的其余部分示例代码:
let point = CGPoint(x: mapView.bounds.size.width/2, y: -100)
region.center = mapView.convert(point, toCoordinateFrom: mapView)
mapView.setRegion(region, animated: false)
我发现这个一个相当简单但有效的解决方案。
我们的想法是使用地图矩形而不是一个区域的。
MKMapRect totalMapRect = MKMapRectNull;
for (id<MKAnnotation> annotation in self.mapView.annotations)
{
MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
MKMapRect mapRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
totalMapRect = MKMapRectUnion(totalMapRect, mapRect);
}
[self.mapView setVisibleMapRect:totalMapRect edgePadding:UIEdgeInsetsMake(30, 30, 30 + verticalOffset, 30) animated:YES];
我们的想法是遍历所有注解和共同创造的每工会它们最小的地图矩形。这会给你的所有注释的最小矩形。
然后你可以使用[setVisibleMapRect: edgePadding:]
并添加任何保证金,以便销会在屏幕和较低的利润率应该仅仅是保证金+偏移。
这适用于多个批注,但对于1个注解RECT会如此狭窄,地图将被放大太多意义。在这种情况下,你必须反复折腾的矩形大小。
替代的解决方案(SWIFT 4.2)
Josh's解决方案的工作,但它需要您设置的区域,该区域的两倍看起来像在你的应用滞后,所以我建议反对。相反,你可以使用一些简单的坐标诀窍提前转移适合您的注释(S)你的区域,然后你只需要一次设置地图的区域。
该MKCoordinateRegion
的跨度属性有你需要移位的所有信息。跨度表示可以在你的地图的观点,即要行进度量。与一个的latitudeDelta
的跨度是指从位置图的顶部到底部的距离是一个纬度度。所以,简单地改变你的地区的中心,通过基于跨度的转变协调起来:
var coordinate = regionThatFitsYourAnnotation.center
let span = regionThatFitsYourAnnotation.span
coordinate.latitude = coordinate.latitude - (span.latitudeDelta * 1/5) // 1/5 works well for my needs, adjust to your liking.
let shiftedRegion = MKCoordinateRegion(center: coordinate, span: span)
mapView.setRegion(shiftedRegion, animated: false)