Ajouter une sous-vue à MKMapView qui se trouve au-dessus de la carte mais en dessous des vues d'annotation?

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

Question

Pour une application que je suis en train de construire, j'ai une "vieille carte" personnalisée. effet PNG que je voudrais superposer sur la vue MKMapView. Malheureusement, j’ai tenté de faire cela d’une des manières toutes les deux:

  1. Ajouter une sous-vue à MKMapView (problème: le UIImageView pour le fichier PNG est placé au-dessus des punaises d'annotation, ce qui semble bizarre
  2. Faites de l'image une vue d'annotation elle-même et placez-la au-dessous des autres (problème: défilement, je dois déplacer l'image de la vue d'annotation; pendant un moment, il n'y a que la carte normale au lieu de l'effet old-timey) .

Ce que je souhaite fondamentalement accomplir est de disposer d'une sous-vue superposée au-dessus des cartouches, mais en dessous des vues d'annotation, et qui reste stable tant que l'utilisateur fait défiler les idées?

Était-ce utile?

La solution

Notez que la hiérarchie, les annotations, le comportement, etc., du sous-code MKMapView se déroulent de manière privée interne MKMapViewInternal La classe qui modifie donc quelque chose (d’une manière que je suggère ou d’une autre) de cette structure peut entraîner le rejet de votre application depuis Appstore.

Je n'ai pas de solution complète, juste une idée. Mon idée est de faire en sorte qu'une vue de superposition ait le même aperçu que les vues d'annotation et de garantir que les annotations seront placées sur notre superposition. Dans MKMapViewDelegate, nous implémentons:

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

Ce code fait la moitié de ce que vous voulez - vous obtenez une vue placée entre les tuiles de carte et les annotations. La tâche restante consiste à modifier le cadre de vue de superposition personnalisé en fonction du défilement / zoom de la carte (je posterai si je trouve le chemin).

Autres conseils

J'ai finalement fait quelque chose de similaire et d'une manière différente. Je voulais atténuer l'affichage de la carte en ajoutant une superposition blanche, mais je ne voulais pas atténuer les annotations. J'ai ajouté une superposition à la carte (en réalité, j'ai dû en ajouter deux car cela ne me plaisait pas d'essayer d'ajouter une superposition pour le monde entier).

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

Ensuite, vous devez ajouter le délégué à la carte pour les dessiner:

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

C'est assez vieux, mais peut-être encore pertinent pour certains d'entre vous.

Je voulais assombrir la carte, mais pas les vues d'annotation.

Ce que j'ai fait était très simple et je ne sais pas encore s'il y a des solutions de rechange ...

J'ai placé un UIView avec un arrière-plan noir transparent au-dessus de MKMapView , puis j'ai ajouté le code suivant:

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

J'espère que cela vous aidera .. et bien sûr - si vous rencontrez un problème avec cette solution, merci de me le faire savoir:)

Modifier n ° 1: A oublié de mentionner que self.viewDark devrait avoir userInteraction désactivé.

Modifier n ° 2: Une autre chose qui m'a aidé est de définir autoresizesSubviews de self.viewDark sur NO .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top