Hinzufügen Subview MKMapView, die oberhalb der Karte ist, aber unterhalb der Beschriftungsansichten?

StackOverflow https://stackoverflow.com/questions/1622633

Frage

Für eine app, die ich baue, habe ich eine eigene „alte Karte“ -Effekt PNG, die ich auf der MKMapView Ansicht zu überlagern möchten. weder Art und Weise habe ich versucht, dies leider zu tun, ist hier genau richtig:

  1. Fügen Sie ein Subview der MKMapView (Ausgabe: die UIImageView für das PNG wird platziert oben die Annotation Pins, die seltsam aussieht
  2. Machen Sie das Bild eine Anmerkung selbst es sehen und stellen unter den anderen (Ausgabe: auf blättern, ich habe die Anmerkungsansicht Bild zu bewegen, und für eine Weile gibt es nur die reguläre Karte anstelle der alten timey-Effekt) .

Was ich will, im Grunde zu erreichen, ist ein Subview hat, die über den maptiles geschichtet ist, aber unterhalb der Beschriftungsansichten, und das wird stabil halten, während der Benutzer blättert rund um irgendwelche Gedanken?

War es hilfreich?

Lösung

Beachten Sie, dass alle MKMapView Subviews Hierarchie, Anmerkungen, Verhalten etc. Erlöse in internen privaten MKMapViewInternal Klasse so etwas zu ändern (in einer Weise, die ich vorschlagen oder ein anderer) in dieser Struktur kann die Anwendung veranlassen, von Appstore abgelehnt.
Ich habe nicht eine vollständige Lösung, nur eine Idee. Meine Idee ist, eine Überlagerungsansicht hat die gleiche Superview als Beschriftungsansichten zu machen und sicherzustellen, dass Anmerkungen über unsere Overlay gestellt werden. In MKMapViewDelegate wir implementieren:

- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
    if (views.count > 0){
        UIView* tView = [views objectAtIndex:0];

        UIView* parView = [tView superview];
        UIView* overlay = [tView viewWithTag:2000];
        if (overlay == nil){
            overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MY_IMAGE_NAME]];
            overlay.frame = parView.frame; //frame equals to (0,0,16384,16384)
            overlay.tag = 2000;
            overlay.alpha = 0.7;
            [parView addSubview:overlay];
            [overlay release];
        }

        for (UIView* view in views)
            [parView bringSubviewToFront:view];
    }
}

Dieser Code hat eine Hälfte von dem, was Sie wollen - Sie eine Ansicht zwischen Kartenkacheln und Anmerkungen gelegt bekommen. Die verbleibende Aufgabe ist es, individuelle Überlagerungsansicht Rahmen zu ändern nach Karte Scrollen / Zoomen (Ich werde schreiben, wenn ich den Weg finden).

Andere Tipps

Ich habe etwas ähnliches und in einer anderen Art und Weise am Ende. Ich wollte die mapview verblassen durch ein weißes Overlay hinzufügen, aber ich wollte nicht die Anmerkungen verblassen. Ich fügte hinzu, ein Overlay zur Karte (eigentlich hatte ich zwei hinzufügen, wie es mir nicht wie der Versuch, ein Overlay für den gesamten Globus hinzuzufügen).

CLLocationCoordinate2D pt1, pt2, pt3, pt4;
pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, 180);
pt3 = CLLocationCoordinate2DMake(-85, 180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords[] = {pt1, pt2, pt3, pt4};
MKPolygon *p = [MKPolygon polygonWithCoordinates:coords count:4];
[self.mapView addOverlay:p];

pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, -180);
pt3 = CLLocationCoordinate2DMake(-85, -180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords2[] = {pt1, pt2, pt3, pt4};
MKPolygon *p2 = [MKPolygon polygonWithCoordinates:coords2 count:4];
[self.mapView addOverlay:p2];

Dann müssen Sie die Karte Delegaten hinzuzufügen, sie zu ziehen:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
    if ([overlay isKindOfClass:MKPolygon.class]) {
        MKPolygonRenderer *polygonView = [[MKPolygonRenderer alloc] initWithOverlay:overlay];
        polygonView.fillColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.4];
        return polygonView;
    }
    return nil;
}

Es ist ziemlich alt, aber vielleicht noch relevant für einige von Ihnen.

Ich wollte die Karte dunkler machen, aber nicht die Beschriftungsansichten.

Was ich tat, war sehr einfach, und ich weiß noch nicht, ob es einige Fallbacks hat ...

habe ich ein UIView mit einem schwarzen transparentem Hintergrund über den MKMapView, und dann hinzugefügt, um den folgenden Code:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views
{
    for (MKAnnotationView *view in views) {
        view.center = [self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark];
        [self.viewDark addSubview:view];
    }
}

Hoffe, es hilft .. und natürlich - wenn Sie irgendwelche Fragen zu dieser Lösung finden lassen Sie es mich wissen:)

Bearbeiten # 1: Vergessen, dass self.viewDark zu erwähnen, hätte userInteraction deaktiviert.

Bearbeiten # 2: Eine andere Sache, die mir geholfen, self.viewDark der autoresizesSubviews setzt auf NO.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top