简体   繁体   English

iOS中的mkmapview图像叠加缩放内存问题

[英]mkmapview image overlay zooming Memory issue in ios

When I am adding a imageOverlay with high resolution image and map zooms image in the map gone and got memory issues.some times my app crashes. 当我添加具有高分辨率图像和地图缩放的imageOverlay时,地图中的图像消失了并出现了内存问题。有时我的应用程序崩溃了。 How can this be solved? 如何解决呢?

Here is my code 这是我的代码

-(void)addOverlay
 {
    MapOverlay *overlay = [[MapOverlay alloc] initWithRouteOverlay:self.routeOverlayObj];
    [self.mapView addOverlay:overlay];
 } 
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
 {
if([overlay isKindOfClass:[MapOverlay class]])
{
   mapOverlay = (MapOverlay *)overlay;
    NSLog(@"%@ %@",routeInfoObj.routeOverlay,[UIImage imageNamed:routeInfoObj.routeOverlay]);
    ATTMapOverLayRender *mapOverlayRender = [[ATTMapOverLayRender alloc] initWithOverlay:mapOverlay overlayImage:[UIImage imageNamed:routeInfoObj.routeOverlay] andImageFile:[NSString stringWithFormat:@"%@.png",routeInfoObj.routeOverlay]];

    return mapOverlayRender;
}
else
{


    MKPolylineRenderer *routeRenderer = [[MKPolylineRenderer alloc] initWithPolyline:routePolyline];
    routeRenderer.strokeColor = [UIColor redColor];
    routeRenderer.fillColor = [UIColor redColor];
    routeRenderer.lineWidth = 5;
    return routeRenderer;

}
return nil;
 }

and in "ATTMApOVerlayRender.h" 并在“ ATTMApOVerlayRender.h”中

@interface ATTMapOverLayRender : MKOverlayRenderer
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage   andImageFile:(NSString *)file;
@property (nonatomic, weak) UIImage *overlayImage;
@end

"ATTMApOVerlayRender.h" “ ATTMApOVerlayRender.h”

#import "ATTMapOverLayRender.h"

@implementation ATTMapOverLayRender
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage    andImageFile:(NSString *)file {
self = [super initWithOverlay:overlay];
if (self) {
    self.overlayImage = overlayImage;

}

return self;
  }
 - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {


 CGImageRef image = _overlayImage.CGImage;
MKMapRect overlayMapRect = [self.overlay boundingMapRect];
CGRect overlayRect = [self rectForMapRect:overlayMapRect];

// draw image
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, -overlayRect.size.height);
CGContextDrawImage(context, overlayRect, image);

}
 @end

I'm running into similar problems on a tile overlay project as well. 我在图块叠加项目上也遇到了类似的问题。 I was able to significantly improve the memory usage by maintaining a single MKMapOverlayRenderer . 通过维护单个MKMapOverlayRenderer我能够显着提高内存使用率。

Rather than allocating memory for a new MKOverlayRenderer (or MKPolylineRenderer ) every time the mapView: renderForOverlay: method is called, create a class variable and rewrite to it. 而不是每次调用mapView: renderForOverlay:方法时都为新的MKOverlayRenderer (或MKPolylineRenderer )分配内存,而是创建一个类变量并将其重写。

So in your ViewController.h or whatever class contains your mapView that calls -(MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>) overlay have, 因此,在您的ViewController.h或包含您的mapView的任何类中,调用-(MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)叠加层,

@property (nonatomic, strong) MKOverlayRenderer *renderer;

And in the declaration of -(MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)overlay 并在-(MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)overlay

use 采用

self.renderer = [[MKOverlayRenderer alloc] init...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM