0

Hi everyone I hope you can help me:

- (IBAction) addPoints: (id) sender
{
NSArray *latitudePoints;
NSArray *longitudePoints;
BOOL flag = NO;
@try
{
switch (lugar)
{
    case 0:
        break;

    case 1:
        latitudePoints = @[@27.781361, @27.777894, @27.766683, @27.757066, @27.745613, @27.737327, @27.728247, @27.720827, @27.720866, @27.719083, @27.722266, @27.721097, @27.739263, @27.758177, @27.780688];
        longitudePoints = @[@-15.714188, @-15.720175, @-15.726072, @-15.740874, @-15.746066, @-15.759544, @-15.763944, @-15.774408, @-15.764822, @-15.752658, @-15.735975, @-15.715497, @-15.718150, @-15.712244, @-15.713213];
        flag = YES;
        break;

    case 2:
        latitudePoints = @[@28.249792, @28.254583, @28.259865, @28.264000, @28.265621, @28.267694, @28.270308, @28.272192, @28.273966, @28.275698, @28.277723, @28.279901];
        longitudePoints = @[@-16.841880, @-16.842477, @-16.842657, @-16.844832, @-16.848396, @-16.851215, @-16.852329, @-16.856142, @-16.859281, @-16.860882, @-16.862011, @-16.863116];
        flag = YES;
        break;

    default:
        [NSException raise:@"Unknown place" format:@"Unknown place"];
        break;
}
// NSLog(@"Lugar %d Flag %d",lugar,flag);
if (flag && [longitudePoints count] == [latitudePoints count])
{
    anotacionesMapa *point; // anotacionesMapa is a custom MKAnnotation class, just have title, subtitle and coord atribute
    CLLocationCoordinate2D placePoint;
    NSMutableArray *pointList = [[NSMutableArray alloc] initWithCapacity:[longitudePoints count]];
    for (int c = 0; c < [longitudePoints count]; c++)
    {
        placePoint.latitude = [[latitudePoints objectAtIndex:c] doubleValue];
        placePoint.longitude = [[longitudePoints objectAtIndex:c] doubleValue];
        if (c % 2 == 0)
            point = [[anotacionesMapa alloc] initWithTitle:[NSString stringWithFormat:@"[Picture here] Nothing"]
                                                  subtitle:@""
                                             andCoordinate: placePoint];
        else
            point = [[anotacionesMapa alloc] initWithTitle:[NSString stringWithFormat:@"Something"]
                                                  subtitle:@"[Pic here] test"
                                             andCoordinate: placePoint];
        [self.mapView addAnnotation:point];
        CLLocation *linePoint = [[CLLocation alloc] initWithLatitude:placePoint.latitude longitude:placePoint.longitude];
        [pointList addObject: linePoint];
    }
    ruta = [[CSMapRouteLayerView alloc] initWithRoute:pointList
                                              mapView:self.mapView];
}
}
@catch (NSException *exception)
{
UIAlertView *alert;
alert = [[UIAlertView alloc] initWithTitle:@"Error..."
                                   message:[NSString stringWithFormat:@"%@", exception]
                                  delegate:self
                         cancelButtonTitle:@"Aceptar"
                         otherButtonTitles:nil];
[alert show];
}
}

I have this code, then I need to print lines between that coordinates from PuntosLT and PuntosLG that store latitudes and longitudes, but when it suppouse to print the lines (that lines are printed actually, in blue color, I want to print in red color) the MKMapView get frozen and can't move around and can't zoom, and I think it get bugs and draw other lines that is not in the coords, and finally my custom images in my anotations are red pins again, like default and the information like title, subtitle doesn't work.

Thanks.

EDIT: The Method/Constructor

-(id) initWithRoute:(NSArray*)routePoints mapView:(MKMapView*)mapView
{
self = [super initWithFrame:CGRectMake(0, 0, mapView.frame.size.width, mapView.frame.size.height)];
[self setBackgroundColor:[UIColor clearColor]];

[self setMapView:mapView];
[self setPoints:routePoints];

// determine the extents of the trip points that were passed in, and zoom in to that area. 
CLLocationDegrees maxLat = -90;
CLLocationDegrees maxLon = -180;
CLLocationDegrees minLat = 90;
CLLocationDegrees minLon = 180;

for(int idx = 0; idx < self.points.count; idx++)
{
    CLLocation* currentLocation = [self.points objectAtIndex:idx];
    if(currentLocation.coordinate.latitude > maxLat)
        maxLat = currentLocation.coordinate.latitude;
    if(currentLocation.coordinate.latitude < minLat)
        minLat = currentLocation.coordinate.latitude;
    if(currentLocation.coordinate.longitude > maxLon)
        maxLon = currentLocation.coordinate.longitude;
    if(currentLocation.coordinate.longitude < minLon)
        minLon = currentLocation.coordinate.longitude;
}

MKCoordinateRegion region;
region.center.latitude     = (maxLat + minLat) / 2;
region.center.longitude    = (maxLon + minLon) / 2;
region.span.latitudeDelta  = maxLat - minLat;
region.span.longitudeDelta = maxLon - minLon;

[self.mapView setRegion:region];
[self.mapView setDelegate:self];
[self.mapView addSubview:self];

return self;
}
Alejandro L.
  • 1,066
  • 5
  • 17
  • 38
  • There's something missing from your code. You added the MKAnnotation tag but you don't seems to use it. Also, changing the variable names so they can be readable in English would be very useful. – gcamp Jan 30 '13 at 16:12
  • Does the app use ARC? Also, please show the code for `initWithRoute:mapView:` in `CSMapRouteLayerView` if possible. –  Jan 30 '13 at 17:13
  • 1
    Using `@try` / `@catch` is very un-Cocoa.! – Abizern Jan 30 '13 at 17:17
  • Hi, @AnnaKarenina my App use ARC, this is a try test app that I'm doing for testing MKMapView is not an "official" app... I edited and added the method. Then Abizem why is un-Cocoa, what do you use to check errors or exceptions? because cocoa throw too many exceptions... – Alejandro L. Jan 31 '13 at 08:45
  • We use Exceptions to catch programmer errors and NSError to handle run-time conditions. There is a whole [Error Handling Programming Guide](http://developer.apple.com/library/ios/#Documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorHandling/ErrorHandling.html) that is worth your while to read. – Abizern Jan 31 '13 at 11:05
  • I already fixed: http://stackoverflow.com/questions/10598322/iphone-how-to-draw-line-between-two-points-on-mapkit – Alejandro L. Jan 31 '13 at 11:55

1 Answers1

1

I fixed using some new variables from apple mapkit, I removed CSMapRouteLayerView lib. I added:

MKPolyline *routeLine;
MKPolylineView *routeLineView;

and this code in my question method to add lines:

- (IBAction) addPuntos: (id) sender
{
NSArray *puntosLt;
NSArray *puntosLg;
BOOL flag = NO;
@try
{
    switch (lugar)
    {
        case 0:
            break;

        case 1:
            puntosLt = @[@27.781361, @27.777894, @27.766683, @27.757066, @27.745613, @27.737327, @27.728247, @27.720827, @27.720866, @27.719083, @27.722266, @27.721097, @27.739263, @27.758177, @27.780688];
            puntosLg = @[@-15.714188, @-15.720175, @-15.726072, @-15.740874, @-15.746066, @-15.759544, @-15.763944, @-15.774408, @-15.764822, @-15.752658, @-15.735975, @-15.715497, @-15.718150, @-15.712244, @-15.713213];
            flag = YES;
            break;

        case 2:
            puntosLt = @[@28.249792, @28.254583, @28.259865, @28.264000, @28.265621, @28.267694, @28.270308, @28.272192, @28.273966, @28.275698, @28.277723, @28.279901];
            puntosLg = @[@-16.841880, @-16.842477, @-16.842657, @-16.844832, @-16.848396, @-16.851215, @-16.852329, @-16.856142, @-16.859281, @-16.860882, @-16.862011, @-16.863116];
            flag = YES;
            break;

        default:
            [NSException raise:@"Lugar desconocido" format:@"Lugar desconocido"];
            break;
    }
    // NSLog(@"Lugar %d Flag %d",lugar,flag);
    if (flag && [puntosLg count] == [puntosLt count])
    {
        anotacionesMapa *punto;
        CLLocationCoordinate2D lugarPunto;
        CLLocationCoordinate2D puntitos[[puntosLg count]];
        for (int c = 0; c < [puntosLg count]; c++)
        {
            lugarPunto.latitude = [[puntosLt objectAtIndex:c] doubleValue];
            lugarPunto.longitude = [[puntosLg objectAtIndex:c] doubleValue];
            punto = [[anotacionesMapa alloc] initWithTitle:[NSString stringWithFormat:@"[Foto barco] Sin avistamientos"]
                                                  subtitle:@""
                                             andCoordinate: lugarPunto];
            [self.mapView addAnnotation:punto];
            puntitos[c] = CLLocationCoordinate2DMake(lugarPunto.latitude, lugarPunto.longitude);
        }
        self.routeLine = [MKPolyline polylineWithCoordinates:puntitos count:[puntosLg count]];
        [self.mapView setVisibleMapRect: [self.routeLine boundingMapRect]];
        [self.mapView addOverlay: self.routeLine];
    }
}
@catch (NSException *exception)
{
    UIAlertView *alert;
    alert = [[UIAlertView alloc] initWithTitle:@"Error..."
                                       message:[NSString stringWithFormat:@"%@", exception]
                                      delegate:self
                             cancelButtonTitle:@"Aceptar"
                             otherButtonTitles:nil];
    [alert show];
}
}

PD: I will not use @try/@catch, this is a sample app for me using MKMapView so I will keep them in this mini project, the rest I will follow http://developer.apple.com/library/ios/#Documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorHandling/ErrorHandling.html

Thanks.

Alejandro L.
  • 1,066
  • 5
  • 17
  • 38
  • 1
    Yes, using real MKOverlay objects is better than what CSMapRouteLayerView seemed to be doing (adding UIView subviews to the map view). But note that if you plan to add more than one overlay at a time, you'll need to stop using the single `routeLine` reference (that comes from some tutorial which doesn't account for multiple overlays). –  Jan 31 '13 at 13:02
  • I only need one overlay so I use `if ([anotaciones count] >= 1) { **self.routeLineView = nil;** self.routeLine = nil; [self.mapView removeOverlay: routeLine]; [self.mapView removeAnnotations: anotaciones]; [anotaciones removeAllObjects]; }` every time i add new points (case 1 or case 2) never both because I only need one of them, even if in a future I add 2000 cases only 1 will be displayed, and If I display other, the prev. will delete cause if you print a new one is because you wont use anymore the last one. – Alejandro L. Jan 31 '13 at 14:33