2014-04-24 6 views
5

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 

     } 
    } 
} 
+0

Se si hanno problemi di dimensione dell'immagine, si consiglia di controllare 'CATiledLayer'. –

risposta

6

Se ci si rivolge iOS 5 e versioni successive è possibile accedere scrollView proprietà da UIWebView istanza e B ecome its delegate.

Siamo interessati ai metodi scrollView:zoom*. L'idea di base è:

1) Su -scrollViewDidZoom: si sta posizionando il pulsante in base a scrollView.zoomScale con prendendo in considerazione currentButtonFrame;

2) Il -scrollViewDidEndZooming:withView:atScale: si sta aggiornando currentButtonFrame.

Verificare il progetto di esempio here.

enter image description here

+0

ottima risposta !!! Sto guardando il file e ti faccio sapere! – Ilario

+0

funziona perfettamentema solo una domanda: hai un'idea con molti altri pulsanti ?? come 100 pulsanti .. Non riesco a scrivere 100 volte il codice in scrollviewDidZoom – Ilario

+0

ho modificato la mia domanda di nuovo;) – Ilario