- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在运行时修改 MKPolyline 的路径以避免它与另一个重叠。
我已经设法获得所有重叠点,
我想做的是在
func createPath()
中MKPolylineRenderer 的添加一个偏移量来做点,所以理论上,它应该用我添加的小偏移量绘制相同的路径,并且它不应该再重叠,但遗憾的是,这种情况没有发生,折线是以同样的方式绘制,就像没有改变一样。
我在
addPolyline()
之后第一次尝试这样做函数,但我读到,一旦你这样做,重绘多段线的一种方法是删除它并再次添加它,所以我决定,出于测试目的,在添加多段线之前完成所有这些,所以当我最终将其添加到 map ,它已经有了关于重叠点的信息,但这也没有用。
假设:
1. map 工作在不同的线程上,因此更改没有反射(reflect)出来,这与此有关。
这没关系。应该是这样来优化渲染的。
<强>2。完成此操作的正确方法不在
createPath()
中。函数。确实不是
draw()
中应用
这是createPath()函数
override func createPath()
{
let poly = polyline as! TransportPolyline
switch poly.id
{
case 1:
let newPath = CGMutablePath()
for index in 0...poly.pointCount
{
let point = poly.points()[index]
let predicate = { MKMapPointEqualToPoint($0, poly.points()[index]) }
//This is the offset I should apply
let offset: CGFloat = overlapsAtPoints.contains(predicate) ? 100000.0 : 0.0
//I tried to use a transform as well, but the result was the same
var transform = CGAffineTransform(translationX: offset, y: offset)
if index == 0
{
//Here I add the offset and/or the transform without success
newPath.moveTo(&transform, x: CGFloat(point.x) + offset, y: CGFloat(point.y) + offset)
}
else
{
//Here as well
newPath.addLineTo(&transform, x: CGFloat(point.x) + offset, y: CGFloat(point.y) + offset)
}
}
//Set the new path to the Renderer path property
self.path = newPath
default: break
}
}
<罢工> 这就是draw()函数
override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext)
{
let poly = polyline as! TransportPolyline
guard poly.id == 1 else {
super.draw(mapRect, zoomScale: zoomScale, in: context)
return
}
//If I apply this the Polyline does move, obviously it move all the Path and not only the segments I want.
context.translate(x: 1000, y: 1000)
super.draw(mapRect, zoomScale: zoomScale, in: context)
}
非常感谢任何建议。
更新:
我发现问题可能出在我如何在绘制方法中绘制上下文。
文档说:
The default implementation of this method does nothing. Subclasses are expected to override this method and use it to draw the overlay’s contents.
所以通过调用 super.draw()
我什么都没做。
关于如何正确重写此方法有什么想法吗?还要考虑到这一点:
To improve drawing performance, the map view may divide your overlay into multiple tiles and render each one on a separate thread. Your implementation of this method must therefore be capable of safely running from multiple threads simultaneously. In addition, you should avoid drawing the entire contents of the overlay each time this method is called. Instead, always take the mapRect parameter into consideration and avoid drawing content outside that rectangle.
最佳答案
所以基本上我走在正确的轨道上,但使用了错误的工具。实现此目的的实际方法是重写 MKPolylineRenderer 子类中的 draw()
函数。
override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext)
{
//First validate that the Rect you are asked to draw in actually
has some content. See last quote above.
let theMapRect: MKMapRect = self.overlay.boundingMapRect;
guard (MKMapRectIntersectsRect(mapRect, theMapRect)) || self.path != nil else {
return
}
//Do some logic if needed.
//Create and draw your path
let path = CGMutablePath()
path.moveTo(nil, x: self.path.currentPoint.x, y: self.path.currentPoint.y)
path.addLines(nil, between: remainingPoints, count: remainingPoints.count)
context.addPath(path)
//Customise it
context.setStrokeColor(strokeColor!.cgColor)
context.setLineWidth((lineWidth + CGFloat(0.0)) / zoomScale)
//And apply it
context.strokePath()
}
通过这样做,我能够成功地为每个叠加绘制我想要的路径,没有任何麻烦。
关于ios - 正确子类化 MKOverlayRenderer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38169254/
import UIKit import CoreData import Foundation import MapKit struct Geoshape : Codable { let coo
我试图在运行时修改 MKPolyline 的路径以避免它与另一个重叠。 我已经设法获得所有重叠点,我想做的是在 func createPath() 中MKPolylineRenderer 的添加一个偏
我无法让 MKPolygonRenderer 出现在我的 map 上。我有一个包含 MKMapView 的 MapViewController 类,并创建 CustomMapOverlay 实例以在
我正在尝试使用 MKOverlayRenderer 在 map 上呈现文本。我有一个现有的功能性 MKOverlayRenderer 渲染一组点,所以我唯一的问题是为 '-(void)drawMapR
我想在 mapview 上绘制带孔的圆(如 donut )。我的代码在这里。 - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale
我正在尝试使用 MKOverlayRenderer 绘制一条线。我的覆盖渲染器的 drawMapRect 大致是: let path = CGPathCreateMutable() CGPathMov
我将自定义 MKOverlayRenderer 添加到 MKMapView,然后我将其删除removeOverlays() 但是覆盖在那里停留了一段时间,mkmapview 更新绘图,大多数时候我将
我想在 map 叠加层中放置一张图片,该图片会随着 map 缩放。使用下面的代码,图像出现在 map View 中,但它被拉伸(stretch)以适合 View 。如何在叠加层内保持图像的原始纵横比?
MKMapView 正在按图 block 绘制 MKOverlayRenderer。问题是并非覆盖的所有图 block 都以相同的缩放比例绘制在屏幕上。同时,叠加层后面的 map 被精确且正确地绘制出
现在,由于它们在 MKOverlayView 中不再有 View ,并且它被称为 MKOverlayRenderer,我如何才能将 UIImageView 添加到我的 MKMapView 中?注意:我
我正在开发一个高度基于 map 的应用程序,并且我正在使用 MBXMapKit 框架(基于 MapKit 构建)以便在我的 MapView 中显示自定义 Mapbox map 图 block 而不是默
我正在为 iOS 7 更新一个 iOS 6 应用程序,发现在 iOS 7 中处理覆盖的方式已经完全改变。 我们正在整个 map 上绘制浅灰色叠加层。在 iOS 6 中一切正常,在 iOS 7 中我们没
我是代码新手,我正在尝试实现类似 Reminders 应用程序的功能: 我关注了另一个 answer实现它并 这里是我的代码: 在我的 ViewController 中: var circle = M
我构建了一个自定义 MKOverlayRenderer 以构建多边形、应用混合模式,然后将它们添加到 map View 。在我的 drawMapRect 函数中,我使用 CGPoints 数组来构建多
我收到这个错误 "Nil is incompatible with return type 'MKOverlayRenderer'". 这是我的代码: func mapView(mapView: MK
在 iOS 7 中,MKOverlayView 被 MKOverlayRenderer 取代。之前,我可以添加一个 UIImageView 作为 MKOverlayView 的 subview ,并访
对于一个应用程序,我必须在 MKMapView 上放置一个 MKCircle 注释。但是,需要移动/调整圆圈的大小。我知道有人问过这个问题,例如Moving MKCircle in MKMapView
在 MKOverlayRenderer 已经传递给 Map 之后,如何访问和修改它的 alpha 属性? 事实上,我可以在 rendererForOverlay 方法中修改 alpha 属性: - (
所以当我使用 Swift 1.2 时,这个函数运行良好,并为我提供了我需要的功能。 func mapView(mapView: MKMapView, rendererForOverlay overla
我有一个 map View ,如下所示 map 中绘制的线条使用的是MKPolyline。我使用苹果 MapKit 框架来显示我的 map 。我的要求是当用户在 Polyline 上选择注释时,折线应
我是一名优秀的程序员,十分优秀!