문제

내가 빌드하는 앱의 경우 MKMapView보기에서 오버레이하고 싶은 맞춤형 "오래된지도"효과 PNG가 있습니다. 불행히도, 내가 이것을하려고 시도한 방법도 정확히 옳습니다.

  1. mkmapview에 서브 뷰 추가 ~ 위에 주석 핀. 이상하게 보입니다
  2. 이미지를 주석 자체로 만들고 다른 것 아래로 배치하십시오 (문제 : 스크롤에서는 주석보기 이미지를 움직여야하며 잠시 동안 구식 맵 대신 일반 맵이 있습니다).

내가 기본적으로 달성하고자하는 것은 맵틸 위에 겹쳐 지지만 주석보기 아래에있는 서브 뷰를 갖는 것입니다. 사용자가 생각을 스크롤하는 동안 꾸준히 유지 될 것입니다.

도움이 되었습니까?

해결책

모두에 유의하십시오 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];
    }
}

이 코드는 원하는 것의 절반을 수행합니다. 맵 타일과 주석 사이에 뷰가 표시됩니다. 나머지 작업은 MAP 스크롤/확대/축소에 따라 사용자 정의 오버레이 뷰 프레임을 변경하는 것입니다 (길을 찾으면 게시하겠습니다).

다른 팁

나는 결국 비슷하고 다른 방식으로 무언가를했다. 흰색 오버레이를 추가하여 MapView를 퇴색시키고 싶었지만 주석을 희미하게하고 싶지 않았습니다. 나는지도에 오버레이를 추가했습니다 (실제로 전체 지구에 오버레이를 추가하려고하는 것을 좋아하지 않았기 때문에 두 개를 추가해야했습니다).

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

그것은 꽤 오래되었지만 아마도 당신 중 일부와 관련이있을 수도 있습니다.

나는지도를 어둡게 만들고 싶었지만 주석보기는 아닙니다.

내가 한 일은 매우 간단했고 아직 폴백이 있는지 아직 모르겠습니다 ...

나는 a 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