简体   繁体   中英

iOS 6 - Mapview, overlay fades in

I have been building an app which draw the lines of the current user moving along the map. Now, in iOS5 when I add the overlay to the mapview, it justs add it directly, in iOS6 it adds the overlay with "fade in" animation. I don't want this annoying animation. I also have a function which plays the trail upon the coordinates saved (after the user is done running or walking), when I play this, the lines flicker very fast, just because of this animation. This is really annoying and I really would appreciate any guidance or a solution to get rid of this animation.

Code for adding overlays:

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];

Code for displaying overlay:

- (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;
}

Thanks!

EDIT:

Code for going through the path:

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];
    }
}

Instead of using a MKPolylineView you can use your own subclass of MKOverlayView (superclass of MKPolylineView) and then override drawMapRect:zoomScale:inContext: where you draw the lines yourself.

I guess with this you won't have any fade in animation (I'm using it and never noticed any animation).

Try the following code for your drawMapRect:zoomScale:inContext: implementation. You need to create the properties lineColor(CGColor) and 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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM