[英]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.