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

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

Вопрос

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

<Ол>
  • Добавить подпредставление в MKMapView (проблема: UIImageView для PNG помещается над выводами аннотации, что выглядит странно
  • Сделайте изображение представлением аннотации и поместите его ниже других (проблема: при прокрутке, мне нужно переместить изображение представления аннотации, и на некоторое время вместо эффекта прежнего времени есть только обычная карта) .
  • Чего я в основном хочу добиться, так это иметь подпредставление, расположенное над слоями, но под аннотациями, и оно будет оставаться устойчивым, пока пользователь прокручивает вокруг & # 8212; какие-либо мысли?

    Это было полезно?

    Решение

    Обратите внимание, что иерархия, подпункты, аннотации, поведение и т. д. всех 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];
        }
    }
    

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

    Другие советы

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

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

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

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

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

    Я поместил 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: Еще одна вещь, которая помогла мне, - установить для self.viewDark autoresizesSubviews значение NO .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top