Ho l'immagine della mappa mondiale in .svg
che carico in UIWebView
. (Ho usato il formato svg e UIWebView perché l'immagine è troppo grande per essere caricata in UIImageView)aggiungi UIButton come sottoview di UIWebView e ridimensionalo quando lo zoom è
Vorrei mettere un mucchio di Pin su questa mappa con posizione fissa.
Per esempio, se ho messo una spilla in Brasile, questo pin deve sempre rimanere in Brasile, non importa se ho scorrere o ingrandire la UIWebView
come si può fare questo? per ora il rotolo non è un problema, ma solo lo zoom
NSString *path = [[NSBundle mainBundle] pathForResource:@"map" ofType:@"svg"];
NSURL *url=[[NSURL alloc] initFileURLWithPath:path];
NSURLRequest *request=[[NSURLRequest alloc]initWithURL:url];
[_webView loadRequest:request];
_webView.scalesPageToFit = YES;
_webView.delegate = self;
UIButton *but = [[UIButton alloc] initWithFrame:CGRectMake(100, 400, 30, 30)];
[but setBackgroundColor:[UIColor blackColor]];
[_webView.scrollView addSubview:but];
EDIT come suggerito dal @dymv utilizzando i metodi delegato di ScrollView, possiamo cambiare la dimensione dei tasti, ma ci sono problemi:
come riutilizzare questo codice con molti pulsanti?
EDIT2:
ho risolto il problema relativo a molti pulsanti, ma ora sembra che non riesco a mettere il perno fisso sullo stesso punto.
ovviamente le coordinate del pin cambiano a seconda dello zoom, ma il problema è che il pin visivamente si sposta troppo dove dovrebbe essere.
Ad esempio, come sopra, se metto una puntina sulla costa del Brasile, quando faccio lo zoom indietro, la puntina passa sull'oceano e non rimane sulla costa. Questo è un problema come con tanti spilli, il risultato finale sarebbe veramente male
-(void)webViewDidFinishLoad:(UIWebView *)webView {
CGPoint primo = CGPointMake(100, 100);
for (int i = 0; i<36; i++) {
UIButton *bu = [[UIButton alloc] initWithFrame:CGRectMake(primo.x, primo.y, 10, 18)];
[bu setBackgroundImage:[UIImage imageNamed:@"pin"] forState:UIControlStateNormal];
[bu addTarget:self action:@selector(buttonTouch:) forControlEvents:UIControlEventTouchUpInside];
[_webView.scrollView addSubview:bu];
bu.tag = i;
[arrayOfPoint addObject:[NSValue valueWithCGPoint:bu.center]];
[arrayOfRect addObject:[NSValue valueWithCGRect:bu.frame]];
primo.x = primo.x + 20;
primo.y = primo.y + 10;
}
}
-(void)scrollViewDidZoom:(UIScrollView *)scrollView {
CGFloat scale = scrollView.zoomScale;
for (UIView *button in scrollView.subviews) {
if ([button isMemberOfClass:[UIButton class]]) {
int i = button.tag;
NSValue *newValue = [arrayOfRect objectAtIndex:i];
CGRect newFrame = [newValue CGRectValue];
button.frame = CGRectMake(CGRectGetMinX(newFrame) * scale,
CGRectGetMinY(newFrame) * scale,
CGRectGetWidth(newFrame),
CGRectGetHeight(newFrame));
}
}
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
for (UIView *button in scrollView.subviews) {
if ([button isKindOfClass:[UIButton class]]) {
int tag = button.tag;
CGRect rectPre = button.frame;
[arrayOfRect replaceObjectAtIndex:tag withObject:[NSValue valueWithCGRect:rectPre]];
}
}
}
risolto:
per risolvere il problema del posizionamento è stato sufficiente a cambiare questo metodo:
-(void)scrollViewDidZoom:(UIScrollView *)scrollView {
CGFloat scale = scrollView.zoomScale;
for (UIView *button in scrollView.subviews) {
if ([button isMemberOfClass:[UIButton class]]) {
int i = button.tag;
NSValue *newValue = [arrayOfRect objectAtIndex:i];
CGRect newFrame = [newValue CGRectValue];
button.frame = CGRectMake(CGRectGetMinX(newFrame) * scale,
CGRectGetMinY(newFrame) * scale,
CGRectGetWidth(newFrame) * scale, //add *scale
CGRectGetHeight(newFrame) * scale); // add *scale
}
}
}
Se si hanno problemi di dimensione dell'immagine, si consiglia di controllare 'CATiledLayer'. –