在地图视图的可见矩形内显示 MKMapViewAnnotations

2024-02-07

我在路径样式视差表视图标题内显示 MKMapView。为了创建效果,mapView 边界大于用户可见的区域。我需要设置地图视图区域,以便所有地图注释都包含在 MKMapView 的可见矩形内。最好的方法是什么?

为了清楚起见编辑:这是一个用例。 mapView 大小为 320 x 380。然而,可见区域由矩形 (0.0, 20.0, 320.0, 100.0) 定义。我需要设置区域,以便所有注释都出现在地图视图中的该矩形中。


设置地图区域,使所有注释都包含在地图的特定部分中MKMapView可以分三步完成。输入是mapViewannotationsFrame.

  1. 计算一个MKMapRect mapRect包含所有注释。
  2. 计算填充插入量mapView.bounds and annotationsFrame.
  3. Call -setVisibleMapRect:edgePadding:animated:在地图视图上。

下面是测试的屏幕截图。红色覆盖层显示annotationsFrame.

这是代码。Beware:这一切都在一种方法中,可以简化将其添加到代码中的过程,并且未针对边缘情况进行测试例如传入具有相同坐标的 n 个注释,或者注释相距太远以至于地图必须缩小太多,或者坐标以 +/-180 度经度跨越地图边缘。

- (void)zoomAnnotationsOnMapView:(MKMapView *)mapView toFrame:(CGRect)annotationsFrame animated:(BOOL)animated
{
    if (_mapView.annotations.count < 2) return;


    // Step 1: make an MKMapRect that contains all the annotations

    NSArray *annotations = _mapView.annotations;

    id <MKAnnotation> firstAnnotation = [annotations objectAtIndex:0];
    MKMapPoint minPoint = MKMapPointForCoordinate(firstAnnotation.coordinate);
    MKMapPoint maxPoint = minPoint;

    for (id <MKAnnotation> annotation in annotations) {
        MKMapPoint point = MKMapPointForCoordinate(annotation.coordinate);
        if (point.x < minPoint.x) minPoint.x = point.x;
        if (point.y < minPoint.y) minPoint.y = point.y;
        if (point.x > maxPoint.x) maxPoint.x = point.x;
        if (point.y > maxPoint.y) maxPoint.y = point.y;
    }

    MKMapRect mapRect = MKMapRectMake(minPoint.x, minPoint.y, maxPoint.x - minPoint.x, maxPoint.y - minPoint.y);


    // Step 2: Calculate the edge padding

    UIEdgeInsets edgePadding = UIEdgeInsetsMake(
        CGRectGetMinY(annotationsFrame),
        CGRectGetMinX(annotationsFrame),
        CGRectGetMaxY(mapBounds) - CGRectGetMaxY(annotationsFrame),
        CGRectGetMaxX(mapBounds) - CGRectGetMaxX(annotationsFrame)
    );


    // Step 3: Set the map rect

    [mapView setVisibleMapRect:mapRect edgePadding:edgePadding animated:animated];
}

如果您追求完美的展示位置(谁不追求完美的展示位置),则需要考虑以下三件事:

  1. 该代码确保所有坐标都在annotationsFrame,但注释本身可能位于外部。为了防止这种情况,只需使用更多的填充即可。例如,如果您的注释为 20x20 且以坐标为中心,则在所有边上再使用 10 个填充。
  2. 在 iOS 7 以下,地图不会缩放到完美的缩放比例,而是缩放到下一个图块大小(2 的幂)。因此,注释周围会有比所需更多的空间,如屏幕截图所示。
  3. 在 iOS 7 上,地图视图不仅会完美缩放,还会自动关注状态栏。为了使计算正确,您需要从 iOS 7 的顶部填充中减去状态栏高度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在地图视图的可见矩形内显示 MKMapViewAnnotations 的相关文章

随机推荐

  • 在模板 Vue 中插入脚本标签

    我正在创建一个集成支付服务 支付服务为我提供了form里面有一个脚本标签 我想在我的组件模板中插入带有脚本标签的表单 但是 vue 不允许在模板中插入标签脚本 如何在模板组件中插入带有脚本标签的表单 结账表格支付服务
  • Asus MeMO Pad 没有驱动程序可以使用 eclipse 进行应用程序调试

    我有同样的问题 如下所示SO post https stackoverflow com questions 15029581 asus memo pad debug for android apps 我得到了一个新的 Asus Memo P
  • 如果数组为 NULL,则不会出现“未定义的偏移量”

    我不确定这是一个错误 所以任何人都可以告诉为什么如果您尝试访问未定义为 NULL 的数组的键 php 不显示通知吗 文件说 Converting NULL to an array results in an empty array 因此 访
  • 根据 WPF 中的 TextBox 文本属性启用/禁用按钮?

    我正在通过谷歌寻找代码 该代码可以根据文本框中的文本属性启用和禁用按钮 如果文本框有一些文本 则应启用按钮 否则应禁用按钮 我得到了一些代码 但是 xaml 中的代码 但没有 c 我无法理解它是如何工作的 请帮助我理解以下代码的行为
  • 我应该直接向新学习者教授 CSS 布局,还是应该先教如何使用表格进行布局,然后再教授如何进行无表格布局?

    我应该直接向新学习者教授 CSS 布局还是应该先教如何使用表格进行布局 然后再教 div CSS 之间我应该教什么HTML 还是 XHTML 两者是相同的 所以我应该直接从 XHTML 1 0 Strict 开始吗 您应该教他们使用 CSS
  • 如何用AVPlayer解析m3u文件

    我想从 m3u 文件头而不是 id3Tags 获取曲目信息 在AVPlayer的timedMetaData它只是提供了 id3Tag 解析的属性 如何使用 AVPlayer 从以下 m3u 文件中获取标题 艺术家 url 等 EXTM3U
  • 我可以关闭 System.Net.Mail 中的电子邮件地址验证吗?

    我正在尝试使用电子邮件与传真服务器软件通信 传真服务器将接受格式化的 SMTP 邮件并将其转换为传真并将其发送到收件人地址中定义的传真号码 已通过同一服务器从 Outlook 发送电子邮件对此进行了手动测试 这是我的问题 System Ne
  • 运行 Cucumber 测试时 Rails 应用程序的端口

    有没有办法在测试中获取在 Cucumber 测试期间运行 Rails 应用程序的端口 我尝试了 Capybara server port 但为零 Thanks 使用 selenium 驱动程序时 可以在以下位置找到该端口 Capybara
  • 如何在远程服务器上启动进程、断开连接,然后收集输出?

    我正在用 python 编写自动化代码来测试网络应用程序的行为 因此 我的代码需要能够在网络中的服务器上启动进程 脚本 例如 tcpdump 或 python 脚本 断开连接 运行其他进程 然后返回并关闭 评估之前启动的进程 我的网络是 W
  • 使用 Node.js 将 HTML 转为 PDF

    我正在寻找可打印的pdf我的网站网页的版本 就像是express render 仅将页面呈现为pdf 有谁知道有一个节点模块可以做到这一点 如果没有 您将如何实施 我见过一些方法谈论使用无头浏览器 例如phantom js 但不确定流程是什
  • 为什么这个facet_grid不删除列?

    你好 有这个数据集 tdat structure list Condition structure c 1L 3L 2L 1L 3L 2L 1L 3L 2L 1L 3L 2L 1L 3L 2L 1L 3L 2L 1L 3L 2L 1L 3L
  • NHibernate Linq 预加载与通用存储库

    目前 我们为所有实体使用通用存储库 该存储库公开 IQueryable 使用 NH3 linq 支持 然后我们的服务层使用该通用存储库来构建特定查询 我现在需要急切地加载一个关联 有什么方法可以公开 IQueryable 并传入可选的获取表
  • 如何从 iText 7 中的 pdf 页面获取文本位置

    我想找到 PDF 页面中的文本位置 我尝试过的是使用简单的文本提取策略通过PDF文本提取器获取PDF页面中的文本 我正在循环每个单词来检查我的单词是否存在 使用以下方法分割单词 var Words pdftextextractor Spli
  • 尝试在 Rails 3 中创建具有 habtm 关系的范围

    我正在尝试对活动记录进行基本搜索 但由于 has and belongs to many 关系而遇到麻烦 以下是我创建的记录和范围 Class Section lt lt ActiveRecord Base has and belongs
  • 将所有 .html 扩展名重定向到 .php

    我想更新网站上的所有页面以使用包含页脚和页眉 所以我必须将很多 html页面更改为 php 所以我正在寻找一种方法将所有以 html 结尾的页面重定向到相同的 url 但以 php 结尾 RewriteEngine On RewriteRu
  • UITableView 重新加载部分

    我只想重新加载一部分而不是整个表格 有没有什么方法UITableView tableView reloadData 用于加载全表 我想知道如何仅加载一个部分 因为表中有大量行 reloadSections 方法让我烦恼 因为我必须构造一些对
  • 在性能关键代码中,我应该更喜欢 C# 中的变量还是数组的多重间接寻址?

    在某些性能关键的程序 单线程 中 如果我有原始类型的数组 并且需要在循环中多次访问这些数组的相同索引 我应该使用 tmp 变量 还是只是数组上的常量间接寻址会更好 更快 我还可以想象 两者都可能是相同的 在编译时透明地进行了优化 让我们测试
  • PSexec版权输出

    有谁知道 如何禁用运行 PSExec 时出现的 版权标头 每次我运行 psexec 命令时 我都会看到以下消息 PsExec v2 11 Execute processes remotely Copyright C 2001 2014 Ma
  • 语法错误,第 12 行出现意外的“函数”

    我有一个 url 其中包含各种 POST DATA 最后还有一个图像文件 我的示例链接是 http website link com page gf signature signature 565dbca63791e5 87676354 p
  • 在地图视图的可见矩形内显示 MKMapViewAnnotations

    我在路径样式视差表视图标题内显示 MKMapView 为了创建效果 mapView 边界大于用户可见的区域 我需要设置地图视图区域 以便所有地图注释都包含在 MKMapView 的可见矩形内 最好的方法是什么 为了清楚起见编辑 这是一个用例