Aggiunta di una subview in MKMapView che si trova sopra la mappa ma sotto le visualizzazioni delle annotazioni?

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

Domanda

Per un'app che sto costruendo, ho una "vecchia mappa" personalizzata effetto PNG che vorrei sovrapporre nella vista MKMapView. Sfortunatamente, nessuno dei due modi in cui ho provato a farlo è esattamente giusto:

  1. Aggiungi una sottoview a MKMapView (problema: UIImageView per il PNG viene posizionato sopra i pin di annotazione, che sembrano strani
  2. Trasforma l'immagine in una vista annotazione stessa e posizionala sotto le altre (problema: sullo scorrimento, devo spostare l'immagine della vista annotazione e per un po 'c'è solo la mappa normale invece dell'effetto old-timey) .

Quello che sostanzialmente voglio realizzare è avere una sottoview che è stratificata sopra i maptiles ma sotto le viste delle annotazioni, e che rimarrà stabile mentre l'utente scorre, qualche idea?

È stato utile?

Soluzione

Nota che tutti i MKMapView sottopongono la gerarchia, le annotazioni, il comportamento, ecc. dei proventi in privato interno MKMapViewInternal in modo che la modifica di qualsiasi cosa (in un modo che suggerisco o altro) in questa struttura possa causare il rifiuto dell'applicazione da Appstore.
Non ho una soluzione completa, solo un'idea. La mia idea è di fare in modo che una vista overlay abbia la stessa superview delle viste annotazioni e assicurarmi che le annotazioni vengano posizionate sul nostro overlay. In MKMapViewDelegate implementiamo:

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

Questo codice fa la metà di quello che vuoi: ottieni una vista posizionata tra i riquadri della mappa e le annotazioni. L'attività rimanente è quella di cambiare il riquadro di visualizzazione della sovrapposizione personalizzata in base allo scorrimento / zoom della mappa (posterò se trovo il modo).

Altri suggerimenti

Ho fatto qualcosa di simile e in un modo diverso alla fine. Volevo sbiadire la visualizzazione della mappa aggiungendo una sovrapposizione bianca, ma non volevo sbiadire le annotazioni. Ho aggiunto un overlay alla mappa (in realtà ho dovuto aggiungerne due perché non mi piaceva provare ad aggiungere un overlay per l'intero globo).

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

Quindi devi aggiungere il delegato della mappa per disegnarli:

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

È piuttosto vecchio, ma forse ancora rilevante per alcuni di voi.

Volevo rendere la mappa più scura, ma non le viste delle annotazioni.

Quello che ho fatto è stato molto semplice e non so ancora se ha dei fallback ...

Ho inserito un UIView con uno sfondo nero-trasparente sopra il MKMapView , e quindi ho aggiunto il seguente codice:

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

Spero che sia d'aiuto .. e ovviamente - se riscontri problemi con questa soluzione, faccelo sapere :)

Modifica n. 1: Hai dimenticato di dire che self.viewDark dovrebbe avere userInteraction disabilitato.

Modifica n. 2: Un'altra cosa che mi ha aiutato è impostare self.viewDark autoresizesSubviews su NO .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top