2014-04-24 10 views
5

Mam obraz mapy świata w .svg, który ładuję do UIWebView. (Użyłem formatu svg i UIWebView, ponieważ obraz jest zbyt duży, aby załadować go do UIImageView)dodaj UIButton jako podzbiór UIWebView i zmień jego rozmiar, gdy powiększasz

Chciałbym umieścić kilka pinów na tej mapie ze stałą pozycją.

Na przykład jeśli kładę szpilkę w Brazylii, to pin musi pozostać na zawsze Brazylii, bez względu na to, czy przewijać lub powiększać UIWebView

w jaki sposób można to zrobić? teraz zwój nie jest problemem, ale tylko 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 jak sugeruje @dymv wykorzystaniem metod delegat Scrollview możemy zmienić rozmiar przycisków, ale istnieją problemy:

jak ponownie użyć tego kodu z wieloma przyciskami?

EDIT2:

I rozwiązać problem w stosunku do wielu przycisków, ale teraz wydaje się, że nie mogę umieścić trzpień zamocowany na tym samym punkcie.

oczywiście współrzędne sworznia zmieniają się w zależności od powiększenia, ale problem polega na tym, że pinezka wizualna porusza się zbyt mocno w miejscu, w którym powinna być.

Na przykład jak powyżej, jeśli mogę umieścić kołek na wybrzeżu Brazylii, kiedy pomniejszyć, sworzeń przechodzi nad oceanem i nie pozostają na wybrzeżu. To jest naprawdę problem, ponieważ tak wiele kołków, wynik końcowy będzie naprawdę źle

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

    } 
    } 
} 

rozwiązany:

rozwiązać problem pozycjonowania wystarczyło, aby zmienić tę metodę:

+0

Jeśli masz problemy rozmiar, może chcesz sprawdzić 'CATiledLayer'. –

Odpowiedz

6

Jeśli kierujesz reklamy na system iOS 5 lub nowszy, możesz uzyskać dostęp do usługi scrollView z instancji UIWebView jego delegat.

Jesteśmy zainteresowani metodami scrollView:zoom*. Podstawowy pomysł to:

1) Na -scrollViewDidZoom: ustawiasz przycisk zgodnie z scrollView.zoomScale, biorąc pod uwagę currentButtonFrame;

2) Na -scrollViewDidEndZooming:withView:atScale: aktualizujesz currentButtonFrame. Przetestuj przykładowy projekt here.

enter image description here

+0

świetna odpowiedź !!! Patrzę na plik i dam ci znać! – Ilario

+0

to działa idealnie ..ale tylko pytanie: masz pomysł z wieloma dodatkowymi przyciskami? jak 100 przycisków .. Nie mogę napisać 100 razy kodu w scrollviewDidZoom – Ilario

+0

Ponownie zredagowałem moje pytanie;) – Ilario

Powiązane problemy