2014-04-24 18 views
5

Ich habe das Bild der Weltkarte in .svg, die ich in UIWebView laden. (Ich benutzte SVG-Format und UIWebView, weil das Bild zu groß ist, um in UIImageView zu laden)UIButton als Unteransicht von UIWebView hinzufügen und die Größe beim Zoomen ändern

Ich möchte einen Bündel von Pin auf dieser Karte mit fester Position setzen.

Zum Beispiel, wenn ich einen Stift in Brasilien setzte, muss dieser Pin immer auf Brasilien bleiben, egal ob ich das scrollen oder zoomen UIWebView

, wie Sie dies tun können? denn jetzt ist die Scroll kein Problem, aber nur der 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 wie @dymv mit den Delegatmethoden von Scroll vorgeschlagen, können wir die Größe der Tasten ändern, aber es gibt Probleme:

Wie verwende ich diesen Code mit vielen Tasten?

EDIT2:

Ich löste das Problem in Bezug auf viele Knöpfe, aber jetzt scheint es, dass ich nicht den Stift an der gleichen Stelle fixiert setzen können.

Offensichtlich ändern sich die Koordinaten des Pins abhängig vom Zoom, aber das Problem ist, dass sich der Pin visuell zu sehr dorthin bewegt, wo er sein sollte.

Zum Beispiel wie oben, wenn ich einen Stift an der Küste von Brasilien setzen, wenn ich verkleinern, geht der Stift über den Ozean, und bleibt nicht an der Küste. Das ist wirklich ein Problem, wie bei so vielen Pins, würde das Endergebnis wirklich schlecht sein

-(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]]; 

    } 
    } 
} 

GELÖST:

das Problem der Positionierung zu lösen war genug, um dieses Verfahren zu ändern:

-(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

Wenn Sie die Bildgröße Probleme haben, möchten Sie vielleicht CATiledLayer' auszuchecken '. –

Antwort

6

Wenn Sie Targeting iOS 5 und höher können Sie scrollView Eigenschaft von UIWebView Instanz und b zugreifen erfahre seinen Delegierten.

Wir sind interessiert an scrollView:zoom* Methoden. Grundidee ist:

1) Auf -scrollViewDidZoom: Sie positionieren die Schaltfläche nach scrollView.zoomScale mit Berücksichtigung currentButtonFrame;

2) Unter -scrollViewDidEndZooming:withView:atScale: aktualisieren Sie currentButtonFrame.

Überprüfen Sie das Beispielprojekt here.

enter image description here

+0

große Antwort !!! Ich schaue mir die Datei an und lass es dich wissen! – Ilario

+0

das funktioniert perfekt ..aber nur frage: hast du eine idee mit viel mehr buttons ?? wie 100 Tasten .. Ich kann nicht 100 Mal den Code in scrollviewDidZoom schreiben – Ilario

+0

Ich habe meine Frage erneut bearbeitet;) – Ilario

Verwandte Themen