5

マップビューにいくつかの注釈 (約 500) を追加したいのですが、表示される最大数は 100 です。100 を超えると、viewForAnnotationデリゲート メソッドは呼び出されません。ただし、100 未満の注釈では完全に機能します。

コードは次のとおりです: ( annotationArray配列のカウントが101 未満の場合にのみ機能します)

_allPoints = [[NSMutableArray alloc] init];

NSString* responseFile = [[NSBundle mainBundle] pathForResource:@"Datafile" ofType:@"txt"];
NSData *sampleData = [NSData dataWithContentsOfFile:responseFile];  
if (sampleData) {  
    NSError* error;
    NSDictionary* json = [NSJSONSerialization 
                          JSONObjectWithData:sampleData

                          options:kNilOptions 
                          error:&error];

    NSArray* response = [json objectForKey:@"response"];
    for (NSDictionary *lineDict in response) {
        if ([[lineDict objectForKey:@"data"] isKindOfClass:[NSArray class]]) {
            SinglePoint *singlePoint = [[SinglePoint alloc] initWithDictionary:lineDict];
            [_allPoints addObject:singlePoint];
        }
        else {
            NSLog(@"Error");
        }
    }
}  


_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[_mapView setDelegate:self];
[self.view addSubview:_mapView];

NSMutableArray *annotationArray = [[NSMutableArray alloc] init];
for (int i=0; i<[_allPoints count]; i++) {
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i];
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView];
    [annotationArray addObject:annotation];
}
[_mapView addAnnotations:(NSArray *)annotationArray];

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 };
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO];

デリゲート メソッドは次のとおりです。

編集:コメントによると、ビューの再利用を開始しましたが、運がありません:(

if ([annotation isKindOfClass:[NVPolylineAnnotation class]]) {
    static NSString *viewIdentifier = @"annotationView";
    NVPolylineAnnotationView *annotationView = (NVPolylineAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier];
    if (annotationView == nil) {
        annotationView = [[NVPolylineAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewIdentifier mapView:_mapView];
    }
    return annotationView;
}
return nil;

ドキュメントや他の場所で制限を見つけることができませんでした。それはメモリの問題でしょうか?

4

3 に答える 3

1

最後に、問題を追跡することができました。最初にmapViewの中心を設定してから、後で注釈を追加することで解決しました。以前に 100 個の注釈が表示された理由 (および 100 個のみが表示された理由) はまだわかりません。これに関するあなたの提案と時間をありがとう。

これは私が変更したコードです:-

_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[_mapView setDelegate:self];
[self.view addSubview:_mapView];

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 };
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO];

NSMutableArray *annotationArray = [[NSMutableArray alloc] init];
for (int i=0; i<[_allPoints count]; i++) {
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i];
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView];
    [annotationArray addObject:annotation];
}
[_mapView addAnnotations:(NSArray *)annotationArray];
于 2012-04-14T13:36:37.480 に答える
1

にはのMKMapView制限がありませんannotationViews。しかし、一定数のビュー (+1000) を超えると、かなり遅くなり、使用できなくなります。

その理由は、あなたがannotationView管理を完全に間違って扱っているからだと思います。ARC を使用している場合でも、注釈ごとに固有のビューを作成しないでください。のセルのように、未使用のビューをすべて再利用する必要がありUITableViewます。

これには、 Introduction to MapKit on iOS - Ray Wenderlichなどの優れたチュートリアルがいくつかあります。

これで問題が解決しない場合は、注釈クラスをデバッグしてみてください。(NVPolylineAnnotationおよびNVPolylineAnnotationView)。たぶん、何か問題があります。ポイント配列もチェックして、座標が等しいかどうかを確認しましたか?

于 2012-04-13T18:44:42.237 に答える
0

注釈はいくつでも追加できます。coordinateただし、各アノテーションのビューは、そのアノテーションのプロパティがマップ ビューの表示部分と交差するまで作成されません。注釈をマップに追加しただけでは、MapKit はビューを作成しません。

于 2012-04-13T18:53:28.843 に答える