문제

업데이트

이 문제가 iOS 4.3에서 조용히 고정 된 것 같습니다. 이 시점까지, 주석이 재활용 될 수있는 "충분히"로 간주 된 거리는 매우 밀접하게 확대 된 경우에도 수백 마일 인 것처럼 보였다. iOS 4.3 SDK로 앱을 구축하면 주석이 더 합리적인 한계에 따라 재활용됩니다.


다른 사람 이이 문제를 해결 했습니까? 코드는 다음과 같습니다.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(WWMapAnnotation *)annotation {



// Only return an Annotation view for the placemarks. Ignore for the current location--the iPhone SDK will place a blue ball there.

NSLog(@"Request for annotation view");

if ([annotation isKindOfClass:[WWMapAnnotation class]]){



    MKPinAnnotationView *browse_map_annot_view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"BrowseMapAnnot"];



    if (!browse_map_annot_view) {
        browse_map_annot_view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"BrowseMapAnnot"] autorelease];
        NSLog(@"Creating new annotation view");
    } else {
        NSLog(@"Recycling annotation view");
        browse_map_annot_view.annotation = annotation;
    }

...

보기가 표시 되 자마자

2009-08-05 13:12:03.332 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Request for annotation view
2009-08-05 13:12:03.333 xxx[24308:20b] Creating new annotation view

그리고 계속해서, 모든 주석 (~ 60)에 대해 추가했습니다. 맵은 (올바르게) 현재 직장에 두 개의 주석 만 표시됩니다. ViewDidload에서 지역을 설정하고 있습니다.

if (center_point.latitude == 0) {
    center_point.latitude = 35.785098;
    center_point.longitude = -78.669899;
}

if (map_span.latitudeDelta == 0) {
    map_span.latitudeDelta = .001;
    map_span.longitudeDelta = .001;
}

map_region.center = center_point;
map_region.span = map_span;

NSLog(@"Setting initial map center and region");

[browse_map_view setRegion:map_region animated:NO];

설정중인 지역의 로그 항목은 주석보기가 요청되기 전에 콘솔에 인쇄됩니다.

여기서 문제는 모든 주석이 한 번에 요청되기 때문에 [MapView dequeeEusableAnnotationViewwitHidentifier]는 맵에 모든 주석에 대해 고유 한 mkannotationViews가 있기 때문에 아무것도하지 않는다는 것입니다. 이것은 나에게 메모리 문제로 이어지고 있습니다.

한 가지 가능한 문제는 이러한 주석이 꽤 작은 공간 (~ 1 마일 반경)에 클러스터된다는 것입니다. 맵은 ViewDidload (위도 및 경도 델타 .001)에서 꽤 단단히 확대되었지만 여전히 모든 주석보기를 한 번에로드합니다.

감사...

도움이 되었습니까?

해결책

당신이 기대할 수있는 것은 현재를 기반으로하는 주석보기의 일종의 "클리핑"입니다. region 지도가 표시됩니다.

이것은 방법이 아닙니다 dequeueReusableAnnotationViewWithIdentifier 셀렉터는 작동합니다.

문서에서 :주석 뷰가 화면에서 이동합니다,지도보기는 내부 관리 재사용 대기열로 이동합니다. 새 주석이 화면에서 이동하고 해당 주석보기를 제공하라는 코드가 표시되면 새보기를 작성하기 전에 항상 기존보기를 탈취하려고 시도해야합니다.

따라서 재사용 가능한 메커니즘은 다음과 같은 순서를 호출 할 때만 의미가 있습니다.

//this will create 1000 annotation views
[theMap addAnnotations:my1000annotations];
//this will move them offscreen (but some annotation views may be kept internally for further reuse)
[theMap removeAnnotatios:theMap.annotations];
//when adding back again some annotations onscreen, some of the previous annotation views will be reused.
[theMap addAnnotations:someNew400annotations];

귀하의 경우, 클리핑을 구현하는 방법 (현재 표시된 영역에 대한 주석 만 표시하기 위해)은 다음과 같습니다.

  • MapView에 대의원을 추가하고 구현하십시오 - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 지역이 변경되었을 때 정보를 얻는 방법
  • 이 지역과 일치하는 물건을 얻으려면 모든 물건을 반복하십시오.
  • 해당 객체에 대해서만 맵에 추가 된 (이전에 표시된 주석과 새 주석 사이에 일종의 병합을 구현하거나 처음부터 다시 시작하고 모든 주석을 제거하고 새 주석을 설정할 수 있습니다.

물론, 사용자가 상당히 축소되고 지역의 범위가 너무 커지면 (너무 많은 핀이 표시 되기에는 너무 많음) 결정을 내려야합니다. 모든 주석보기를 표시하고 위험을 감수해야합니다. 지도의 디스플레이에 많은 정보가 제공되지 않음) 또는 "핀을 얻기 위해 확대하기"라는 메시지를 사용자에게 설정합니까? 그러나 이것은 또 다른 이야기입니다 ...;)

다른 팁

이것이 도움이 될지 확실하지 않지만 ~ 60 개의 객체로드로 인한 메모리 문제를 언급했습니다. 현재 맵 지역 센터 및 현재지도 영역 범위를 기반으로 각 객체를 조건부로드하는 방법이 있습니까?

// :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top