问题标签 [mkoverlaypathrenderer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1673 浏览

ios - 自定义 MKOverlay,以米为单位

我通过制作符合 MKOverlay 协议的 NSObject 子类和 MKOverlayPathRenderer 的子类来制作自定义叠加层。我的目标是制作一个锚定到 MKMapView 上的用户位置的圆形叠加层,我可以正常工作。每当我的叠加层上的坐标被设置时,我的渲染器使用键值观察,使其绘制的路径无效,然后重绘。

我遇到的问题是我希望圆的半径以米为单位,但我认为我做的数学不正确,或者我遗漏了一些东西。我在下面发布了覆盖对象和渲染器的源代码(渲染器的接口中没有任何内容)。举个例子,我将半​​径设置为 200 米,但在地图视图中,它只显示为 10 米左右。有谁知道如何解决这个问题?

0 投票
1 回答
874 浏览

ios - 使用 MKOverlayRenderer 绘制带孔的圆圈效果不佳

我想在地图视图上画一个有洞的圆圈(比如甜甜圈)。我的代码在这里。

它在模拟器中运行良好,但在设备上却不行。

在设备上,外圈用颜色填充,内圈没有被剪裁。如何修改我的代码以在设备上正常工作?

0 投票
0 回答
472 浏览

ios - 如何创建一个静态的、实际宽度的 MKOverlayPathRenderer 子类?

我一直在研究现有 MKMapView 的简单路径覆盖。它采用 CGMutablePath 并将其绘制到地图上。目标是绘制代表实际宽度的路径。例如,子类采用以米为单位的宽度并将该宽度转换为代表线宽。这是计算线宽的代码的一个版本:

在这里,我们首先找到与我们的线宽相对应的地图点数,然后将其转换为屏幕点数。我们根据 MKGeometry.h 中的标题注释进行转换:

最后,我们将路径添加到上下文中,将描边属性应用于路径并对其进行描边。

然而,这给出了非常不稳定的结果。渲染器经常在预期的活动区域之外的各个地方随机绘制线条片段,或者根本不绘制一些图块。有时,CPU 会一遍又一遍地重绘同一个图块的多个版本(据我所知)。在这种情况下,文档并没有太大帮助。

我确实有一个工作版本,但它似乎不是正确的解决方案,因为它完全忽略了 zoomScale 并且不使用 -applyStrokePropertiesToContext:atZoomScale:

任何人都有关于这个实现有什么问题的指针?

0 投票
1 回答
2012 浏览

ios - 将 MKOverlayPathRenderer 作为覆盖添加到 MKMapView 会出现异常

一切都在主题中,所以这里是代码

在最后一行,它异常下降:

这意味着我使用了不实现 MKOverlay 的错误类,我明白了,但正如 MKOverlayPathRenderer 的参考中所说 - 它确实如此。所以我有点卡在这个问题上。

0 投票
0 回答
514 浏览

ios - 动画地图叠加:添加时如何使 MKCircle 从 0 扩展到其全尺寸?

我想让我的 MKCircle 在添加到地图时从 0 扩展到其指定的半径大小。MKOverlayRenderer 让我得到了一个不错的最终结果,但它太自发地添加了圆圈。我想对其进行动画处理以获得更平滑的入口,但如果没有动画层,我不知道该怎么做。

我尝试使用 CABasicAnimation 添加扩展 UIView 并在完成时将其替换为覆盖,但代码很难看,并且在添加覆盖时会出现明显的闪烁。

我看过另外两个声称有动画覆盖的项目,但它们都不是我正在寻找的灵丹妙药。

  • http://yickhong-ios.blogspot.com/2012/04/animated-circle-on-mkmapview.html 早在 2012 年,这个人就继承了 MKCircleView 的子类,这显然已被弃用/强烈反对。
  • https://github.com/jhurray/iOS7AnimatedMapOverlay这家伙子类化了UIImageView,加了一个圆png,还加了一些CABasicAnimations,让它展开和淡化。然后,只要选择了注释,他就会将此图像视图添加到地图中。动画效果很好,但是每当区域开始变化时,动画就会被删除,并且只有在区域完成变化时才会再次添加。它不是重绘区域更改的有效叠加层。他所拥有的只是一个设置为 nil 的 MKCircle,如果你想要一个覆盖,它会告诉你“改变它”。当 UIImageView 完成扩展时,我可能会“更改它”以添加叠加层,但有些事情告诉我它会产生与我的 UIView 解决方法相同的闪烁结果。

我正在考虑另一种我不太确定的方法(因为我从未尝试仅从 Core Graphics 产生动画效果),那就是子类MKOverlayRenderer化,将自定义绘图(MKCircle?)设置- (void)drawMapRect:为宽度和高度 x = 0,并使用 anNSTimer递增 x 并调用setNeedsDisplayInMapRect直到圆达到其完整大小。这对我来说听起来有点远,可能有更简单的方法来做到这一点。

我需要有人为我指出正确的方向。

0 投票
2 回答
263 浏览

mkmapview - 在绘制的 MKMapView 的圆圈下方滚动 MKMapView

更新

我需要在 a 上画一个圆MKMapView,我可以在其中获得圆的半径及其中心坐标。但是,我还希望圆圈成为 的子视图MKMapView,以便地图视图可以在圆圈下方滚动,在地图移动时更新其中心坐标,并在地图放大和缩小时更新其半径。

有谁知道我如何能够做到这一点?


这是问题的原始措辞

MKMapView使用下面的代码在 a 上画了一个圆圈:

这有效并在地图视图上产生一个圆圈。但是,当我滚动地图视图时,圆圈会随之移动。我希望圆圈保持静止并让地图视图在圆圈下方滚动。

重要的是要注意,我需要获取圆的中心坐标和半径才能创建区域。出于这个原因,我不能简单地在 MKMapView 上绘制 UIView,因为我无法获得以米为单位的 UIView 的半径。

0 投票
1 回答
266 浏览

ios - MKMapViewDelegate:如何在 rendererForOverlay 中识别叠加层

我正在将两个不同MKGeodesicPolyline的实例添加到MKMapView这样的实例中

我想用需要在rendererForOverlay委托方法中配置的不同样式来渲染这两个叠加层。

我的问题是有哪些选项可以识别上述方法中的两种不同叠加层?

到目前为止,这是我所考虑的:

  1. 子类化:不是一个选项,因为MKGeodesicPolyline是通过静态工厂方法初始化的。
  2. 在属性中保留对覆盖的引用,然后将委托的overlay参数与这些参数进行比较。这确实有效,但感觉有点笨拙。此外,对于两个以上的叠加层,需要使用 anNSSet或 an扩展此方法NSArray

我还能做些什么来简化这一点吗?它似乎MKGeodesicPolyline不具备任何可用于标记的属性。

0 投票
1 回答
374 浏览

ios - Polyline drawMapRect 优化绘图

我在地图上有很多长折线。我想优化他们的绘图,因为在几千个点处,多段线的绘制速度非常慢。

我的drawMapRect样子是这样的:

如果没有太多的点,这很好。但是当有 8-16 个可见的 maprects 和 2-3000 个点时,它们在for.

如果它们只是位置,则解决方案是实现某种四叉树/r-tree 结构并仅过滤当前绘制的那些位置MKMapRect,但我不确定这是否适用于折线本身。

如果我仅过滤当前 maprect 内的线段端点,则可能不会绘制某些线段。例如,点 1-2 之间的两个红色 maprects 中没有线段端点,但仍需要绘制...

在此处输入图像描述

是否有某种类似于四叉树的算法或某种方法来解决这个问题?

0 投票
0 回答
694 浏览

mkmapview - 在 MKMapView 中的折线中绘制方向箭头

我想用箭头方向绘制一条折线。我知道这还没有包含在 Mapkit 中。

我试图创建一个自定义 MKOverlayPathRenderer 并覆盖 drawMapRect 但我对如何做到这一点有点困惑。

有什么方法可以实现我的目标吗?

这是我正在尝试做的一个例子

在此处输入图像描述

0 投票
1 回答
670 浏览

ios - 如何在 MapKit 中获得可见的叠加层?(即来自 Mapkit Ivew 的 MKOverlay/MKOverlayRender)

如何从 MapkitView 中获取当前可见覆盖的列表(数组)?

背景 - 例如,我想在我的 mapkitview 上显示指向某些 Overlay 类型中心的方向箭头,但是如何获得可见的?我可以看到似乎没有办法做到这一点?那么我是否需要通过所有叠加层(实际上是〜8000)并自己检查以查看屏幕上会显示什么?如果 MapKit 已经有效地做到了这一点,作为决定在给定时间需要显示哪些叠加层的一部分,这似乎是一种浪费。