2010-02-08 3 views
8

mapkit을 사용하여지도에 500 점 이상을 플로팅합니다. 확대/축소는 네이티브 Google지도 앱에 비해 조금 불안합니다. 나는 느린 것을 일으키는 것을 발견했습니다. 나는 위의 코드를 주석 처리하면 모든 것이 잘 작동mapkit 성능의 문제가 있습니다

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation { 
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentlocation"]; 
    annView.pinColor = MKPinAnnotationColorGreen; 
    annView.animatesDrop=TRUE; 
    annView.canShowCallout = YES; 
    annView.calloutOffset = CGPointMake(-5, 5); 
    return annView; 
} 

: 나중에 상세 뷰에 대해 서로 다른 핀 색상과 버튼을 추가 할 수 있도록 나는 사용자 정의 주석을 추가 해요. 확대/축소 기능이 매우 부드럽습니다. 실적을 높이기 위해 특수 효과를 다르게 추가해야합니까?

답변

1

지도의 한 부분에 500 개의지도 지점을 추가하면 iPhone 화면의 크기가 의미가 없습니다. 이를 시각화하거나 오른쪽 주석을 클릭하는 방법은 없습니다.

지도의 확대/축소 수준과 중심을 볼 수없고지도에 특수 효과의 하위 집합 만 추가 할 수 있습니까?

다른 앱에서도이 작업을 수행 한 것으로 보았습니다.

+0

그런 지연로드 유형을 어떻게 달성 할 수 있는지 설명 할 수 있습니까? – user230949

+1

MKMapView는지도를 스크롤 할 때마다 대리인에게 메시지를 전달합니다. 그렇게 될 때마다지도의 판매를 알 수 있도록보기의 위도 및 경도 델타를 저장하십시오. 값을 저장하기 전에지도 축척이 늘어나거나 축소되어 주석 수를 조정해야하는지 확인하십시오. 그렇다면 세부적인 수준의 계산 만 수행하십시오. 주석 목록을 통해 실행하고 서로 일정한 거리 이내에있는 주석을 결합하여 하나의 주석을 만듭니다. 사용자가 다시 확대 한 경우 원본 주석으로 바꿉니다. – VictorB

2

St3fan이 맞다고 생각합니다. 이론적으로는지도에 주석을 계속 추가하고보기에서보기를 처리하도록 할 수는 있지만 실제로는 카운트 다운을 조금만 유지하면 화면에 500 개가 너무 많아서 더 잘 볼 수 있습니다.

annView.opaque = YES; 
+0

질문에 대한 오해. 보기 영역에 500 개의 핀이 없습니다. 단지 몇 가지가 있습니다. 충분히 멀리 축소하면 결국 500 개가 모두 표시됩니다. annView.opaque = YES는 도움이되지 않습니다. – user230949

+0

그런 다음지도를 제거해야 할 곳이 보이지 않는 곳으로 확대 한 후지도의 수를 한 번에 제어해야합니다. 그래서 내가 기술적으로 당신이하고있는 일을하도록 만들어 졌는지에 대해 이야기하고있었습니다. 단순히 화면에 보이지 않는 곳에서 많은 주석을 추가하는 것뿐입니다.하지만 성능면에서지도에 많은 주석을 넣을 수는 없으며 그래서지도가 실제로 알고있는 주석을 어느 정도 관리해야합니다. –

+0

네, 동의합니다. 동의합니다. 그러나 어떻게 관리 할 수 ​​있습니까? 그래서 어떤 것을로드 할 것인지,로드하지 않을 것인지를 알고 있습니까? 모든 포인트는 배열에 있습니다. 이 지점이보기 영역에 있고 주석을로드한다고 말하는 사람들이 있습니다. 이들은 주석을 제거하지 않습니다. – user230949

6

500 주석 성능이 고통 이렇게 많은 아마도 너무 많은,하지만하지 그래서 같은 YES 불투명 세트가 주석 뷰를 모두 확인 -

그러나 한 단계는 시도가 당신이 그들 중 일부만 볼 때. 그러나 성능 500 핀 또한

- (MKAnnotationView *)mapView:(MKMapView *)mapView 
      viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *view = nil; 
    if (annotation != mapView.userLocation) { 
     view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"]; 
     if (nil == view) { 
      view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease]; 
     } 
     [view setPinColor:MKPinAnnotationColorGreen]; 
     [view setCanShowCallout:YES]; 
     [view setAnimatesDrop:NO]; 
    } 
    else { 
     // Do something with the user location view 
    } 
    return view; 
} 

을 개선하기 위해 주석과 dequeueing를 사용한다, 드롭 애니메이션 완료하는 데 시간이 오래 걸립니다. [view setAnimatesDrop:NO]

+2

고마워요하지만 dequeueing은 성능에 도움이되지 않습니다. 많은 수의 특수 효과로 인해 실적이 저하되고 있음을 알고 있습니다. 나는 100으로 줄이고 좋은 성능을 얻을 수 있습니다. 지도보기 영역이 변경되면보기로 전환되는 지점에 대한 주석을로드하는 방법이 필요합니다. 게으른로드가 필요하지만 mapkit은 그런 유형의 것에는 적합하지 않습니다. – user230949

+2

dequeueing이 성능에 도움이됩니다. 왜 사용하지 않을까요?"주석보기를 재사용하면이 중요한 작업 중에 새로운보기 개체를 만들지 않아도되므로 스크롤 할 때 성능이 크게 향상됩니다." http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKAnnotationView_Class/Reference/Reference.html –

3

고객 용 iPhone 앱을 작성했으며 상점 브랜드 중 하나에 매장 찾기 도구가 포함되었습니다. 여기에는 501 개의 위치가 포함되어 있으며 미국 전체를 축소하여 보았을 때 애니메이션이 약간 엉망이 될 수 있지만 상태 수준으로 확대하면 핀이 소수에 불과해 확대 할 수 있습니다.

키 :

  • 줌 현재 위치로 사용자는 주석을 추가하기 전에.
  • dequeueReusableAnnotationViewWithIdentifier:을 사용하여 특수 효과 뷰를 재사용하십시오.

첫 번째 지점을 달성하려면 위치 업데이트를 설정하고 첫 번째 알림을받을 때 플래그를 설정해야합니다. 앱에 적합한 지역 범위를 사용하여지도를 해당 위치에 애니메이션화 한 다음 에 addAnnotation:으로 전화하기 전에 현재 위치가 업데이트되었음을 ​​나타내는 을 추가해야하는지 확인합니다.

사용자의 위치를 ​​확대 할 수 없거나 확대하고 싶지 않은 경우 최상위 수준에 표시된 특수 효과를 필터링하고 사용자가 확대 할 때 추가 특수 효과 만 추가 할 수 있습니까?

그건 그렇고, 위의 게시 된 코드에서 메모리 누수가 있다고 생각합니다.대기열 풀기 메커니즘을 사용하지 않으려는 경우에도 mapView:viewForAnnotation:에서 반환하는보기는 자동으로 재생되어야합니다.

1

사용자가 볼 수없는 특수 효과를보기에서 제거하지 않는 경우 MKMapViewDelegate을 사용하면됩니다. 사용자가 국가 수준으로 축소 할 때 성능이 저하되는 경우 집계 된 정보를 확대/축소 수준> 일부 const 값으로 표시 할 수 있습니다. 10 평방 마일 이내에 30 개의 주석 대신 [30 something]과 같은 단일 주석을 표시합니다.