如何在上半部分og mapview上显示注释?

时间:2017-11-17 08:33:43

标签: ios mkmapview

我有一个特殊情况,我似乎无法解决这个问题。

我有一个全屏mapview作为背景。在下半部分,我有其他元素,我需要为我的mapview设置mapregion,以便所有注释都可见并定位在视图的上半部分。

enter image description here

我可以找到所有注释的maprect。 我也可以找到上半部分的矩形 - 甚至可以将其转换为maprect。

但是,如何将这两个maprects关联起来,以便将maprect(并将其压缩)移动到上半部分?

有人可以给我一个提示吗?

4 个答案:

答案 0 :(得分:2)

我有一次类似的设计,除了它是一个注释而不是多个,但原则上它是相同的。

在ViewDidLayoutSubviews中:

  1. 制作包含注释的MKRegion创建CGPoint 位于地图中未覆盖的部分的中心。
  2. 更改 您所在地区的中心到未覆盖的地图部分的中心 使用MKMapView.convert(指向:toCoordinateFrom :)
  3. 显示新内容 通过调用mapView.setRegion(region,animated:false)
  4. 来居中

    你需要弄清楚哪个区域包含你的注释(不是很难找到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 将它们缩放到屏幕的左半部分。