Pergunta

Saudações,

Eu estou tentando desenhar um círculo em um mapa. todas as peças separadas deste trabalho de projecto independente, mas quando eu colocá-los todos juntos ele quebra.

Eu configurei minha UI na minha viewDidLoad, retendo mais do mesmo.

Eu, então, usar eventos de toque para chamar a minha atualização método mapa:

-(void)refreshMap{

NSString *thePath = [NSString stringWithFormat:@"http://maps.google.com/staticmap?center=%f,%f&zoom=%i&size=640x640&maptype=hybrid",viewLatitude, viewLongitude, zoom];
NSURL *url = [NSURL URLWithString:thePath];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *mapImage = [[UIImage alloc] initWithData:data];

mapImage = [self addCircle:(mapImage) influence:(70) latCon:(320) lonCon:(320)];
NSLog(@"-- mapimageview retaincount %i",[mapImage retainCount]);    

mapImageView.image = mapImage;
[mapImage release];}

Configuração assim ele irá carregar o mapa com um círculo uma vez, mas se o mapa é atualizado novamente ele trava.

Se eu comentar o lançamento mapImage funciona repetidamente, mas provoca uma fuga de memória.

O método addCircle que estou usando:

-(UIImage *)addCircle:(UIImage *)img radius:(CGFloat)radius latCon:(CGFloat)lat lonCon:(CGFloat)lon{
int w = img.size.width;
int h = img.size.height; 
lon = h - lon;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

//draw the circle
CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
CGRect leftOval = {lat- radius/2, lon - radius/2, radius, radius};
CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 0.3);
CGContextAddEllipseInRect(context, leftOval);
CGContextFillPath(context);

CGImageRef imageMasked = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

return [UIImage imageWithCGImage:imageMasked];}

Qualquer visão / aconselhar é muito apreciada!

Foi útil?

Solução

UIImage *mapImage = [[UIImage alloc] initWithData:data];
mapImage = [self addCircle:(mapImage) influence:(70) latCon:(320) lonCon:(320)];

Isso não é bom. Você está perdendo a referência ao conteúdo do mapImage quando você transferir-lo na segunda linha. A maneira mais fácil de corrigir isso se provavelmente apenas adicionar uma variável adicional, para que possa manter o controle de ambas as imagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top