Добавление подпредставления в MKMapView, которое находится над картой, но ниже представлений аннотаций?

Для приложения, которое я создаю, у меня есть собственный эффект «старой карты» PNG, который я хотел бы наложить на представление MKMapView. К сожалению, ни один из способов, которыми я пытался это сделать, не совсем правильный:

  1. Добавьте подпредставление в MKMapView (проблема: UIImageView для PNG помещается над булавками аннотаций, что выглядит странно
  2. Сделайте изображение самим видом аннотации и поместите его ниже других (проблема: при прокрутке мне нужно переместить изображение вида аннотации, и какое-то время вместо старомодного эффекта используется обычная карта).

Чего я в основном хочу добиться, так это иметь подвид, который располагается над картами, но ниже представлений аннотаций, и который будет оставаться стабильным, пока пользователь прокручивает его — есть какие-нибудь мысли?


person Zeppomedio    schedule 26.10.2009    source источник
comment
Вау, старый вопрос без абсолютно никакого ответа. +1 от меня, так как мне это тоже нужно   -  person bentford    schedule 09.01.2010
comment
Кто-нибудь уже понял это?   -  person horseshoe7    schedule 20.07.2011


Ответы (3)


Обратите внимание, что вся иерархия MKMapView подпредставлений, аннотации, поведение и т. д. выполняются во внутреннем частном классе MKMapViewInternal, поэтому все меняется ( тем или иным способом, который я предлагаю) в этой структуре может привести к тому, что ваше приложение будет отклонено из Appstore.

У меня нет полного решения, только идея. Моя идея состоит в том, чтобы сделать вид наложения таким же супервидом, как и виды аннотаций, и гарантировать, что аннотации будут размещены поверх нашего наложения. В MKMapViewDelegate реализуем:

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

Этот код делает половину того, что вы хотите — вы получаете представление, расположенное между фрагментами карты и аннотациями. Оставшаяся задача - изменить пользовательскую рамку просмотра наложения в соответствии с прокруткой / масштабированием карты (я опубликую, если найду способ).

person Vladimir    schedule 15.01.2010
comment
Хороший ответ, это сработало и для наложения, где мы хотели градиент на карте, но хотели, чтобы булавки выделялись. - person John Stricker; 15.08.2016

Я сделал что-то подобное, но по-другому в конце. Я хотел скрыть вид карты, добавив белое наложение, но не хотел стирать аннотации. Я добавил оверлей на карту (на самом деле мне пришлось добавить два, так как мне не понравилось, что я пытался добавить оверлей для всего земного шара).

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

Затем вам нужно добавить делегат карты, чтобы нарисовать их:

- (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;
}
person I Brumby    schedule 17.03.2016

Он довольно старый, но, возможно, все еще актуален для некоторых из вас.

Я хотел сделать карту темнее, но не аннотации.

То, что я сделал, было очень простым, и я еще не знаю, есть ли у него какие-то запасные варианты...

Я поместил UIView с черным прозрачным фоном над MKMapView, а затем добавил следующий код:

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

Надеюсь, это поможет .. и, конечно же, если вы обнаружите какие-либо проблемы с этим решением, сообщите мне :)

Правка №1: забыл упомянуть, что self.viewDark должно быть отключено userInteraction.

Правка № 2. Еще одна вещь, которая мне помогла, это установка autoresizesSubviews для self.viewDark на NO.

person chents    schedule 03.01.2016