- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 iPhone 应用程序,其中使用 MKOverlayView 将一个大的 PNG 图像 (1936 × 2967) 放置在 MKMapView 上。我对如何在 MKOverlayView 中正确实现 drawMapRect: 函数有点困惑 - 我应该在绘制图像之前手动分割图像吗?或者我应该让 MKOverlayView 的机制来处理所有这些?
我对其他帖子的印象是,在 MKOverlayView 可用之前,您需要自己为此类任务分割图像,并使用 CATiledLayer。我想也许 MKOverlayView 处理了所有肮脏的工作。
我问的真正原因是,当我使用分配工具通过 Instruments 运行我的应用程序时,我发现随着 map 上自定义图像的引入,我的应用程序使用的实时字节数稳步增加。现在我没有分割我的图像,但我在 Instruments 的泄漏工具中也没有看到内存泄漏的记录。这是我的drawMapRect:函数:
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{
// Load image from applicaiton bundle
NSString* imageFileName = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"map.png"];
CGDataProviderRef provider = CGDataProviderCreateWithFilename([imageFileName UTF8String]);
CGImageRef image = CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
MKMapRect overlayMapRect = [self.overlay boundingMapRect];
CGRect overlayRect = [self rectForMapRect:overlayMapRect];
// draw image
CGContextSaveGState(context);
CGContextDrawImage(context, overlayRect, image);
CGContextRestoreGState(context);
CGImageRelease(image);
}
如果我的drawMapRect:函数不是这些内存问题的原因,有人知道它可能是什么吗?通过调试我知道我的 viewForOverlay: mapView 函数只会为每个覆盖层调用一次,因此并不是内存泄漏或其他原因。
欢迎任何建议!
谢谢,-马特
编辑:所以事实证明内存问题实际上是由 MKMapView 引起的 - 每次我移动 map 时,内存使用量都会非常稳定地上升并且永远不会下降 - 这看起来不太好:(
最佳答案
回答有点晚了,如果将来其他人遇到同样的问题,请将其留在这里。这里的缺陷是试图渲染整个图像,而文档明确指出 -
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.
所以,你只需在mapRect定义的区域中绘制图像的部分
更新:请记住,此处的绘制矩形可能比映射矩形大,需要相应地调整绘制和剪切区域
let overlayMapRect = overlay.boundingMapRect
let overlayDrawRect = self.rect(for: overlayMapRect)
// watch out for draw rect adjustment here --
let drawRect = self.rect(for: mapRect).intersection(overlayDrawRect)
let scaleX = CGFloat(image.width) / overlayRect.width
let scaleY = CGFloat(image.height) / overlayRect.height
let transform = CGAffineTransform.init(scaleX: scaleX, y: scaleY)
let imageCut = drawRect.applying(transform)
// omitting optionals checks, you should not
let cutImage = image.cropping(to: imageCut)
// the usual vertical flip issue with image.draw
context.translateBy(x: 0, y: drawRect.maxY + drawRect.origin.y)
context.scaleBy(x: 1, y: -1)
context.draw(image, in: drawRect, byTiling: false)
关于iphone - 正确使用MKOverlayView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4175369/
我在这里遇到了几个类似的问题,关于获得具有良好性能的动画 MKOverlayView 工作属性(例如,动画雷达覆盖)。然而,虽然答案帮助我朝着正确的方向前进,但我仍然没有完全掌握我所缺少的东西。 我一
我想用混合模式绘制 map 叠加层。但是这段代码只是在没有任何混合模式的情况下绘制白色叠加层。我做错了什么? - (void)drawMapRect:(MKMapRect)mapRect zoomSc
我有一个路线叠加层要放置在 map 上。我必须调整它的旋转,使其与底层 map View 完全重叠。我怎样才能做到这一点?我找到了旋转的角度。如何旋转叠加 View ?到目前为止,我已经添加了叠加层,
我的 map 上有一个自定义 MKOverlayView,我想检测触摸。但是,我似乎无法让叠加层做出响应。我希望它会像忘记将 userInteractionEnabled 设置为 YES 一样愚蠢..
我目前有一个 UIView,它使用 OpenGL 在 MKMapView 之上绘制雷达数据。由于雷达图像的细节水平,需要 OpenGL(CoreGraphics 不够快)。 我正在绘制的所有图像都保存
在我的 MKOverlayView 中,我在绘制传递给 drawMapRect:mapRect:zoomScale:inContext 的 MKMapRect 之外的区域时遇到问题派生类。我试图为集合
我有一个自定义的 MKOverlay 和 MKOverlayView。创建 MKOverlayView 后,我可以设置 View 的 alpha: -(void)drawMapRect:(MKMapR
我有一个自定义的 MKOverlayView,它绘制了一条简单的线。在 drawMapRect: 中,我正在设置 CGContextSetLineWidth(context, 30); 完全放大时看起
我正在尝试使用以下代码为 iOS 5 中的 MapKit 覆盖 View (特别是 MKCircleView)的 alpha 值设置动画: -(void) animateCircle:(MKCircl
更新: 使用 MKOverlayView 投影到 MKMapView 的图像使用 Mercator projection ,而我用作输入数据的图像使用 WGS84 投影。有没有一种方法可以将输入图像转
我有一个 MKOverlayView,它将动画雷达数据显示为一系列图像。我遇到的问题是雷达图像被 MapKit 切割成图 block 。为了交换图像,我有一个定时器调用一个更新函数,该函数在我的叠加层
我使用以下代码在 iPad 上进行了测试。 如果我像下面的代码一样添加 MyOverlay,即使在 drawMapRect 中什么都不做,默认 map 图 block 的 MKMapView 加载也会
我正在开发一个高度基于 map 的应用程序,并且我正在使用 MBXMapKit 框架(基于 MapKit 构建)以便在我的 MapView 中显示自定义 Mapbox map 图 block 而不是默
map 叠加层的新手,但这是一个非常奇怪的问题。 我将 mapView.visibleMapRect 传递到我的覆盖实现并将其作为 boundingMapRect 返回,目前这很好 - 只是尝试在整个
我有一个涉及大量 MKOverlayView 的应用程序。每次将一个添加到 map 时,它也会添加到一个 NSArray 中。当用户希望停止添加覆盖时,我希望他们能够保存它们,并在以后能够访问它们。如
我在 map 上有一个叠加层,我想更改其坐标。为了无缝地做到这一点,我将调用 setNeedsDisplayInMapRect:对 View 进行更改后的方法。 我已经通过更改 fillColor 测
当有多个叠加层添加到 map 时,自定义 MKOverlayView 和标准 MKPolygonView 在某些缩放级别被裁剪时遇到问题。 The overlay of Algeria at two
我想用 png 制作 mapkit 叠加层,但我没有代码,也找不到任何教程。我是新手编码员,非常感谢您的帮助! 谢谢 最佳答案 您需要做一些事情才能做到这一点: 创建自定义 MKOverlayView
在向我的 map View 添加叠加层时,我收到以下警告: Sending 'MKOverlayView *const __strong' to parameter of incompatible t
我是一名优秀的程序员,十分优秀!