我有一个特殊情况,我似乎无法解决这个问题。
我有一个全屏mapview作为背景。在下半部分,我有其他元素,我需要为我的mapview设置mapregion,以便所有注释都可见并定位在视图的上半部分。
我可以找到所有注释的maprect。 我也可以找到上半部分的矩形 - 甚至可以将其转换为maprect。
但是,如何将这两个maprects关联起来,以便将maprect(并将其压缩)移动到上半部分?
有人可以给我一个提示吗?
答案 0 :(得分:2)
我有一次类似的设计,除了它是一个注释而不是多个,但原则上它是相同的。
在ViewDidLayoutSubviews中:
你需要弄清楚哪个区域包含你的注释(不是很难找到max和min lat,lon和添加填充)。以下是其余部分的示例代码:
let point = CGPoint(x: mapView.bounds.size.width/2, y: -100)
region.center = mapView.convert(point, toCoordinateFrom: mapView)
mapView.setRegion(region, animated: false)
答案 1 :(得分:1)
我找到了一个相当简单但有效的解决方案。
我们的想法是使用地图rect而不是区域。
import React, { Component } from "react";
import {
ListItem,
List
} from "native-base";
import {
Provider,
connect
} from 'react-redux';
class MyPage extends Component {
render() {
const { data } = this.props;
console.log('data: ' + JSON.stringify(data)); // this gets called
2x, 1st time is empty, 2nd time is filled
// 2nd times it gets called, looked something like this: "data:
[{"name": "one"},{"name": "two"}]"
return (
<irrelevant components omitted>
<List
dataArray={data}
renderRow={row =>
<ListItem
button
onPress={() => {console.log("todo: navigation")}}>
<Text>{row.name}</Text>
</ListItem>
}
/>
<irrelevant components omitted>
);
}
}
这个想法是迭代所有注释并为每个注释创建一个最小的map rect并将它们组合在一起。这将为您提供所有注释的最小矩形。
然后您可以使用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];
并添加任何边距,以便引脚位于屏幕中,下边距应该是边距+偏移。
这适用于多个注释,但对于1个注释,rect将非常窄,以至于地图将被缩放太多而无法理解。 在这种情况下,你将不得不摆弄矩形。
答案 2 :(得分:0)
替代解决方案(Swift 4.2)
Josh's解决方案可以工作,但是它要求您设置两次区域,这在您的应用程序中可能看起来像是滞后的,所以我建议不要这样做。相反,您可以使用一些简单的坐标知识来预先移动适合注释的区域,然后只需设置一次地图区域即可。
MKCoordinateRegion
的span属性包含进行班次所需的所有信息。跨度表示可以在地图视图中移动的度数,即。 latitudeDelta
为1的跨度表示从地图顶部到底部的距离为一个纬度。因此,只需根据跨度向上移动区域的中心坐标即可:
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)
答案 3 :(得分:0)
我花了很多时间来研究上述答案,但没有找到一个实用的解决方案。
这是我得到的一个解决方案,它可以让您缩放到相当于地图视图 % 的偏移量。
https://gist.github.com/BrentMifsud/2b8ced4789e2c50e5269b1af60aa1717
因此,如果您希望一组注释显示在距地图视图顶部 25% 的位置,则可以使用偏移量 0.25。如果您希望它显示在下半部分,则为 -0.25。
它也自动适用于横向。因此,如果您的手机处于横向,则 0.25 偏移量会将注释缩放到屏幕右侧。 -0.25 将它们缩放到屏幕的左半部分。