2010-01-14 3 views
3

Avant tout je suis désolé pour mon mauvais anglais.en utilisant un UIView comme sous-vue MKMapView pour dessiner un itinéraire

J'essaie de dessiner une route dans un UIView et de définir cette vue en tant que MKMapView.

Maintenant, j'ai une classe UIView (ViewClass) où je mets toutes les méthodes de touches et de définir l'affichage de mon viewcontroller comme une instance de cette classe. MKMapView est une sous-vue viewcontroller.view. Je peux obtenir toutes les touches de MKMapView. Pour tracer une trace, j'ai défini un UIView (trailView) comme sous-vue MKMapView avec la couleur d'arrière-plan claire. J'essaye de déplacer le trailView quand le MKMapView bouge mais je n'obtiens pas de bons résultats. Le mouvement n'est pas parfait.

L'idée est d'avoir la vue attachée au MKMapView. Je ne sais pas si c'est possible ou si je dois vraiment utiliser MKAnnotationView. J'ai déjà essayé avec MKAnnotationView mais cela consomme beaucoup de mémoire.

J'apprécie vraiment de l'aide. Merci d'avance.

Répondre

0

Ceci est une très bonne question. Comment pouvez-vous obtenir les données de pixel de la zone de la carte qui vous intéresse et en fonction de la couleur du chemin, faites les calculs du plus proche voisin. dans la direction que vous recherchez. Enregistrer ce chemin comme vous allez, et rendre une couleur différente dans votre trailView? Ce qui complique encore plus le zoom, c'est que vous devez avoir une trace indépendante de la résolution (convertir une coordonnée de la carte) et non une coordonnée de pixel. Donc, vous convertissez vos coordonnées de pixels en coordonnées de carte, puis il devrait évoluer pour le zoom.

+0

Je ne comprenais pas ce que vous entendez par « basé sur la couleur du chemin, faire des calculs du plus proche voisin ». Ne sont-ils pas plus compliqués? J'ai toujours la pâte si l'utilisation de MKAnnotationView n'est pas une bonne idée. MKAnnotationView consomme-t-il beaucoup de mémoire? J'ai une version de mon application où je l'utilise mais elle plante avec peu de mémoire après avoir créé des annotations. Merci pour votre réponse :) – ideafactory

+0

Peut-être que j'ai mal compris.Quand vous dites que le mouvement n'est pas parfait, je pense que vous voulez dire que la piste n'est pas alignée. Voulez-vous dire que la performance est inacceptable, même si elle est exacte? A partir des documents Apple: "Les objets d'annotation ne fournissent pas la représentation visuelle de l'annotation mais coordonnent généralement (conjointement avec le délégué de la vue cartographique) la création d'un objet MKAnnotationView approprié pour gérer l'affichage." Donc, si vous utilisez beaucoup de coordonnées (milliers) dans un petit espace MKAnnotationView ne semble pas avoir raison. Pouvez-vous nous montrer le code et le journal des accidents? –

0

La piste est alignée mais quand je défile, je reçois un mauvais résultat. En ce qui concerne la version de mon application avec MKAnnotatioView je peux vous montrer le code, mais je ne peux pas vous montrer le journal parce que je ne suis malheureusement pas avec l'iPhone maintenant ...

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

self.startingPoint = newLocation; 

CLLocation *lastLocation; 

if([pointArray count] >= 2) 
{ 
    lastLocation = [pointArray objectAtIndex:1]; 
    [pointArray removeAllObjects]; 
}  

mapView.showsUserLocation = NO; 

double lat,lon;  
lat = newLocation.coordinate.latitude; 
lon = newLocation.coordinate.longitude;   

if(distanceIndex == 0) 
{ 
    [pointArray insertObject:newLocation atIndex:0]; 
} 
else 
{    
    if(distanceIndex == 1) 
    { 
     [pointArray insertObject:newLocation atIndex:1]; 
    } 
    else 
    { 
     [pointArray insertObject:lastLocation atIndex:0]; 
     [pointArray insertObject:newLocation atIndex:1]; 
    } 
}   

if(distanceIndex == 0) 
{ 
    MarkPlace *mark = nil; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateStyle:NSDateFormatterNoStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];  
    NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]]; 
    [dateFormatter release]; 
    NSString *subtitle = [NSString stringWithFormat:@"Time Here: %@", dateStr]; 
    mark = [[[MarkPlace alloc] initWithCoordinate:[[pointArray objectAtIndex:0] coordinate] currentTime:subtitle annotationType:MarkPlaceTypeEnd title:@"Pin Title"] autorelease]; 
    [mapView addAnnotation:mark]; 




} 

//create the route 
MKCoordinateSpan span = mapView.region.span; 
CLLocationCoordinate2D center = mapView.region.center; 

IFRouteAnnotations *routeAnnotation = [[[IFRouteAnnotations alloc] initWithPoints:pointArray:0:span:center] autorelease]; 
[mapView addAnnotation:routeAnnotation]; 

[mapView setRegion:routeAnnotation.region animated:TRUE]; 

distanceIndex = distanceIndex + 1; 
[routeAnnotation release]; 

}

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 
//re-enable and re-position the route display 
for (NSObject *key in [routeViews allKeys]) { 
    IFRouteView *routeView = [routeViews objectForKey:key]; 
    [routeView regionChanged]; 
} 

}

-(MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id <MKAnnotation>)annotation{ 

MKAnnotationView *annotationView = nil; 
NSLog(@"viewForAnnotation"); 
if(distanceIndex == 0) 
{  
    MKPinAnnotationView *pin=[[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease]; 
    pin.pinColor = MKPinAnnotationColorGreen; 
    pin.animatesDrop = TRUE; 
    pin.userInteractionEnabled = YES; 

    annotationView = pin; 
    [annotationView setEnabled:YES]; 
    [annotationView setCanShowCallout:YES]; 
} 

if([annotation isKindOfClass:[IFRouteAnnotations class]]) 
{ 
    IFRouteAnnotations *routeAnnotation = (IFRouteAnnotations *)annotation; 

    annotationView = [routeViews objectForKey:routeAnnotation.routeID]; 

    if(annotationView == nil) 
    { 
     IFRouteView *routeView = [[[IFRouteView alloc] initWithFrame:CGRectMake(0,0, mapView.frame.size.width, mapView.frame.size.height)]autorelease]; 

     routeView.annotation = routeAnnotation; 
     routeView.mapView = mapView; 

     [routeViews setObject:routeView forKey:routeAnnotation.routeID]; 

     annotationView = routeView; 
    } 
} 
return annotationView; 

}

Je ne sais pas si vous comprendrez un ything. Mon code est basé sur link text. Merci pour votre aide !! :)

Questions connexes