1

現在のユーザーが地図に沿って移動する線を描くアプリを作成しています。現在、iOS5 でマップビューにオーバーレイを追加すると、直接追加されるだけで、iOS6 では「フェードイン」アニメーションでオーバーレイが追加されます。こんな迷惑なアニメーションはいらない。また、保存された座標でトレイルを再生する機能もあります (ユーザーが走ったり歩いたりした後)。これを再生すると、このアニメーションのために線が非常に速くちらつきます。これは本当に面倒です。このアニメーションを取り除くためのガイダンスや解決策があれば幸いです。

オーバーレイを追加するコード:

MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D)*2);
pointsArray[0]= MKMapPointForCoordinate(oldLocation.coordinate); 
pointsArray[1]= MKMapPointForCoordinate(newLocation.coordinate);
self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
free(pointsArray);    
[self.mapView addOverlay:self.routeLine];

オーバーレイを表示するコード:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{
    MKOverlayView *overlayView = nil;
    MKPolylineView  *routeLineView = [[MKPolylineView alloc] initWithPolyline:(MKPolyline *)overlay];
    routeLineView.fillColor = [UIColor blueColor];
    routeLineView.strokeColor = [UIColor blueColor];
    routeLineView.backgroundColor = [UIColor clearColor];
    routeLineView.lineWidth = 10;
    routeLineView.lineCap = kCGLineCapRound;
    overlayView = routeLineView;
    return overlayView;
}

ありがとう!

編集:

パスを通過するためのコード:

playTimer = [NSTimer scheduledTimerWithTimeInterval:interval
                                                 target:self
                                               selector:@selector(playPathTimer)
                                               userInfo:nil
                                                repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:playTimer forMode:NSRunLoopCommonModes];

- (void)playPathTimer{
    MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D) * 2);
    double latitude1 = ((WorldPoint *)[coordsArray objectAtIndex:playCounter]).latitude.doubleValue;
    double longitude1 = ((WorldPoint *)[coordsArray objectAtIndex:playCounter]).longitude.doubleValue;
    double latitude2 = ((WorldPoint *)[coordsArray objectAtIndex:playCounter+nextCord]).latitude.doubleValue;
    double longitude2 = ((WorldPoint *)[coordsArray objectAtIndex:playCounter+nextCord]).longitude.doubleValue;
    CLLocation *location1 = [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(latitude1, longitude1)
                                                          altitude:0
                                                horizontalAccuracy:0
                                                  verticalAccuracy:0
                                                         timestamp:[NSDate date]];
    CLLocation *location2 = [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake(latitude2, longitude2)
                                                          altitude:0
                                                horizontalAccuracy:0
                                                  verticalAccuracy:0
                                                         timestamp:[NSDate date]];
    pointsArray[0] = MKMapPointForCoordinate(location1.coordinate);
    pointsArray[1] = MKMapPointForCoordinate(location2.coordinate);
    self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
    free(pointsArray);

    [self.mapView addOverlay:self.routeLine];
    [playRouteLines addObject:self.routeLine];


//    self.mapView.centerCoordinate = CLLocationCoordinate2DMake(latitude1, longitude1);

    playCounter = playCounter + nextCord;
    if(playCounter + nextCord >= coordsArray.count){
//        [displayLink setPaused:YES];
//        [displayLink invalidate];
       [playTimer invalidate];
        playTimer = nil;
        playCounter = 0;
        [self showStartAndEndFlags];
        if(ee.trail.checkpoint.count > 0){
            [self showCheckpoints];
        }
        self.playButton.enabled = YES;
        MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:[self getRegionWithCorrectZooming]];
        [self.mapView setRegion:adjustedRegion animated:YES];
    }
}
4

1 に答える 1

0

MKPolylineView を使用する代わりに、MKOverlayView の独自のサブクラス (MKPolylineView のスーパークラス) を使用してから、線を自分で描画する drawMapRect:zoomScale:inContext: をオーバーライドできます。

これで、アニメーションのフェードは発生しないと思います(私はそれを使用していますが、アニメーションに気づいたことはありません)。

drawMapRect:zoomScale:inContext: の実装で次のコードを試してください。プロパティ lineColor(CGColor) および lineWidth (CGFloat) を作成する必要があります。

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
    MKPolyline *polyline = self.overlay;
    CGContextSetStrokeColorWithColor(context, self.lineColor);
    CGContextSetLineWidth(context, self.lineWidth/zoomScale);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPoint *points = malloc(sizeof(CGPoint)*polyline.pointCount);
    for (int i=0; i<polyline.pointCount; i++) {
        points[i] = [self pointForMapPoint:polyline.points[i]];
    }
    CGPathAddLines(path, NULL, points, polyline.pointCount);

    CGContextAddPath(context, path);

    CGContextDrawPath(context, kCGPathStroke);
    CGPathRelease(path);
    free(points);
}
于 2013-01-24T14:14:23.593 に答える