Adicionando subexibição para MKMapView que é acima do mapa, mas abaixo das vistas de anotação?

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

Pergunta

Para um aplicativo que estou construindo, tenho um "mapa velho" efeito PNG que eu gostaria de sobrepor na visão MKMapView personalizado. Infelizmente, nem maneira que eu tentei fazer isso é exatamente certo:

  1. Adicionar um subexibição ao MKMapView (questão: a UIImageView para o PNG é colocado acima os pinos de anotação, o que parece estranho
  2. Faça a imagem de si mesma vista de anotação e colocá-lo abaixo os outros (emissão: no rolo, eu tenho que mover a imagem vista de anotação, e durante algum tempo não é apenas o mapa regular em vez do velho-timey-efeito) .

O que basicamente quer realizar é ter um subexibição que é em camadas acima das tiras de mapa, mas abaixo das vistas de anotação, e que manterá estável, enquanto o usuário rola em torno-quaisquer pensamentos?

Foi útil?

Solução

Note que todos MKMapView subviews hierarquia, anotações, comportamento etc prossegue na classe MKMapViewInternal assim mudar nada (em uma maneira que eu sugerir ou outra) nesta estrutura pode causar seu aplicativo para ser rejeitado de Appstore.
Eu não tenho uma solução completa, apenas uma idéia. Minha idéia é fazer uma vista de sobreposição têm o mesmo superview como vistas de anotação e assegurar que as anotações serão colocados sobre a nossa sobreposição. Em MKMapViewDelegate vamos implementar:

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

Este código faz a metade do que você quer - você terá uma visão colocada entre os blocos de mapas e anotações. A tarefa restante é para a mudança custom frame vista de sobreposição de acordo com o mapa de rolagem / zoom (vou postar se eu encontrar o caminho).

Outras dicas

Eu fiz algo semelhante e de uma maneira diferente no final. Eu queria desaparecer a mapview por adicionar uma sobreposição branco, mas eu não queria desaparecer as anotações. Eu adicionei uma sobreposição ao mapa (na verdade, eu tive que adicionar dois, pois não gostava de mim tentando adicionar uma sobreposição para todo o 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];

Em seguida, você precisa adicionar o mapa delegado para atraí-los:

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

É muito velho, mas talvez ainda é relevante para alguns de vocês.

Eu queria fazer o mapa mais escura, mas não a vista de anotação.

O que fiz foi muito simples e eu ainda não sei se ele tem algum fallbacks ...

Eu coloquei um UIView com um fundo preto transparente acima da MKMapView, e depois acrescentou o seguinte código:

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

Espero que ajude .. e claro - se você encontrar quaisquer problemas sobre esta solução por favor me avise:)

Edit # 1: Esqueceu-se de mencionar que self.viewDark deveria ter userInteraction desativado.

Edit # 2: Outra coisa que me ajudou é a criação self.viewDark de autoresizesSubviews para NO.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top