2

更新:マイケルはそれを正しく理解しました。これが私の解決策です:

- (void) connectNextCarOnMainThread:(id)annotation{
    [self performSelectorOnMainThread:@selector(connectNextCar:) withObject:annotation waitUntilDone:YES];
}

- (void) connectNextCar:(id)annotation{
    Pin *pin = (Pin *)annotation;
    MKMapRect zoomRect = MKMapRectNull;
    MKMapPoint annotationPoint = MKMapPointForCoordinate(pin.coordinate);
    MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 3, 3);
    if (MKMapRectIsNull(zoomRect)) {
         zoomRect = pointRect;
    } else {
         zoomRect = MKMapRectUnion(zoomRect, pointRect);
    }
    [mapView setVisibleMapRect:zoomRect animated:YES];
    [mapView selectAnnotation:pin animated:YES];

    NSInteger currentIndex=[self.annotations indexOfObject:annotation];
    if(currentIndex < [self.annotations count]){
        [self performSelector:@selector(connectNextCarOnMainThread:) withObject:[self.annotations objectAtIndex:currentIndex+1] afterDelay:5];
    }
}



シンプルな機能を実現したいと思います。X秒ごとに注釈の1つを中央に配置して選択します。しかし、アノテーションの呼び出しで奇妙な動作が発生しています。

これが私のコードです:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
    if(self.movedToFitPins){
        for(id <MKAnnotation> pin in self.annotations)
            [self.mapView addAnnotation:pin];
        self.movedToFitPins = NO;
        [self performSelectorInBackground:@selector(fakeCarConnections) withObject:nil];
    }
}

- (void) fakeCarConnections {
    for (Pin *annotation in self.annotations)
    {
        [NSThread sleepForTimeInterval : 10.0];
        MKMapRect zoomRect = MKMapRectNull;
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 3, 3);
        if (MKMapRectIsNull(zoomRect)) {
            zoomRect = pointRect;
        } else {
            zoomRect = MKMapRectUnion(zoomRect, pointRect);
        }
        [mapView setVisibleMapRect:zoomRect animated:YES];
        [mapView selectAnnotation:annotation animated:YES];
    }
}

だから、何が起こっているのかというと、私は注釈に焦点を合わせています。コールアウトバブルは開きますが、中にテキストはありません。注釈をクリックすると、テキストでコールアウトが正しく開きます。
ここに問題があります。sleepForTimeInterval行にコメントを付けると、コードは正常に機能しますが、他のすべてを通過するため、最後の注釈のみが表示されます。

4

1 に答える 1

1

すべてのUIの変更/メッセージはメインスレッドで発生する必要があります。ループコードを変更して、スリープの代わりにperformSelectorOnMainThread一定時間間隔の後に使用するようにすることをお勧めします(その後の各呼び出しは次の呼び出しを呼び出します)。そうすれば、メインスレッドをブロックせずに、目的の効果を得ることができます。

于 2012-10-23T18:25:31.943 に答える