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
}
}
}
Wenn Sie die Bildgröße Probleme haben, möchten Sie vielleicht CATiledLayer' auszuchecken '. –