2012-05-03 2 views
1

Я просто хотел добавить полилинию к моей карте, которая отображается в таблице viewview. К сожалению, методы делегата не называются ... Было бы хорошо, если кто-то знает почему.Методы делегата MKMapView не работают

Мой tableview.h:

#import <UIKit/UIKit.h> 
#import "Route.h" 
#import <MapKit/MapKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface RoutesDetailView : UITableViewController<MKMapViewDelegate>{ 
    Route *myRoute; 
    MKMapView *mapView; 
    // the view we create for the line on the map 
    MKPolylineView* _routeLineView; 

    // the rect that bounds the loaded points 
    MKMapRect _routeRect; 
    MKPolyline* _routeLine; 
} 

@property (nonatomic, retain) Route *myRoute; 
@property (nonatomic,retain) MKMapView *mapView; 
@property (nonatomic, retain) MKPolyline* routeLine; 
@property (nonatomic, retain) MKPolylineView* routeLineView; 

-(MKPolyline *) loadRoute: (Route *) theRoute; 
@end 

И мой tableview.m:

@implementation RoutesDetailView 
    @synthesize myRoute,mapView; 
    @synthesize routeLine = _routeLine; 
    @synthesize routeLineView = _routeLineView; 

    - (id)initWithStyle:(UITableViewStyle)style 
    { 
     self = [super initWithStyle:style]; 
     if (self) { 
      // Custom initialization 
     } 
     return self; 
    } 

    - (void)didReceiveMemoryWarning 
    { 
     // Releases the view if it doesn't have a superview. 
     [super didReceiveMemoryWarning]; 

     // Release any cached data, images, etc that aren't in use. 
    } 

    #pragma mark - View lifecycle 

    - (void)viewDidLoad 
    {  
     [super viewDidLoad]; 
     MKMapView *myMap = [[MKMapView alloc] initWithFrame:CGRectMake(10, 1, 300 , 300)]; 
     myMap.layer.cornerRadius = 10.0; 
     [self setMapView:myMap]; 
     [mapView setDelegate:self]; 
     CLLocationCoordinate2D annotationCoord; 
     annotationCoord.latitude = [[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultPointLAT", nil)] doubleValue]; 
     annotationCoord.longitude = [[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultPointLONG", nil)] doubleValue]; 
     MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init]; 
     annotationPoint.coordinate = annotationCoord; 
     MKCoordinateRegion region = 
     MKCoordinateRegionMakeWithDistance (annotationPoint.coordinate,[[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultCircle", nil)] doubleValue], [[NSString stringWithFormat:@"%@",NSLocalizedString(@"DefaultCircle", nil)] doubleValue]); 
     [mapView setRegion:region animated:NO]; 
     // Uncomment the following line to preserve selection between presentations. 
     // self.clearsSelectionOnViewWillAppear = NO; 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
    } 

    - (void)viewDidUnload 
    { 
     [super viewDidUnload]; 
     // Release any retained subviews of the main view. 
     // e.g. self.myOutlet = nil; 
    } 

    - (void)viewWillAppear:(BOOL)animated 
    { 
     [super viewWillAppear:animated]; 
    } 

    - (void)viewDidAppear:(BOOL)animated 
    { 
     [super viewDidAppear:animated]; 
    } 

    - (void)viewWillDisappear:(BOOL)animated 
    { 
     [super viewWillDisappear:animated]; 
    } 

    - (void)viewDidDisappear:(BOOL)animated 
    { 
     [super viewDidDisappear:animated]; 
    } 

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
     // Return YES for supported orientations 
     return (interfaceOrientation == UIInterfaceOrientationPortrait); 
    } 

    #pragma mark - Table view data source 


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
. 
. 
. 

      static NSString *CellIdentifier = @"CellMap"; 
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
      [mapView setFrame:CGRectMake(10, 1, cell.frame.size.width-20 , cell.frame.size.height-1)]; 
      [cell addSubview:mapView]; 
      [mapView addOverlay:[self loadRoute:myRoute]]; 
      return cell; 
. 
. 
. 

    } 




    #pragma mark - Table view delegate 
    -(MKPolyline *) loadRoute: (Route *) theRoute 
    { 

     MKMapPoint northEastPoint; 
     MKMapPoint southWestPoint; 

     // create a c array of points. 
     MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * theRoute.latitude.count); 

     for(int idx = 0; idx < theRoute.latitude.count; idx++) 
     { 

      CLLocationDegrees latitude = [[[theRoute latitude] objectAtIndex:idx] doubleValue]; 
      CLLocationDegrees longitude = [[[theRoute longitude] objectAtIndex:idx] doubleValue]; 

      // create our coordinate and add it to the correct spot in the array 
      CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude); 

      MKMapPoint point = MKMapPointForCoordinate(coordinate); 

      // 
      // adjust the bounding box 
      // 

      // if it is the first point, just use them, since we have nothing to compare to yet. 
      if (idx == 0) { 
       northEastPoint = point; 
       southWestPoint = point; 
      } 
      else 
      { 
       if (point.x > northEastPoint.x) 
        northEastPoint.x = point.x; 
       if(point.y > northEastPoint.y) 
        northEastPoint.y = point.y; 
       if (point.x < southWestPoint.x) 
        southWestPoint.x = point.x; 
       if (point.y < southWestPoint.y) 
        southWestPoint.y = point.y; 
      } 

      pointArr[idx] = point; 

     } 

     // create the polyline based on the array of points. 
     self.routeLine = [MKPolyline polylineWithPoints:pointArr count:theRoute.latitude.count]; 

     _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x - southWestPoint.x, northEastPoint.y - southWestPoint.y); 

     // clear the memory allocated earlier for the points 
     free(pointArr); 
     return self.routeLine; 


    } 

    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay 
    { 
     NSLog(@"DELEGATE CALL"); 
     MKOverlayView* overlayView = nil; 

     if(overlay == self.routeLine) 
     { 
      //if we have not yet created an overlay view for this overlay, create it now. 
      if(nil == self.routeLineView) 
      { 
       self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine]; 
       self.routeLineView.fillColor = [UIColor redColor]; 
       self.routeLineView.strokeColor = [UIColor redColor]; 
       self.routeLineView.lineWidth = 15; 
      } 

      overlayView = self.routeLineView; 

     } 

     return overlayView; 

    } 


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     // Navigation logic may go here. Create and push another view controller. 
     /* 
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; 
     // ... 
     // Pass the selected object to the new view controller. 
     [self.navigationController pushViewController:detailViewController animated:YES]; 
     */ 
    } 

    @end 
+0

ли вы имеете в виду viewForOverlay не называется? Запишите широту и долготу каждой добавленной точки и убедитесь, что они верны (не меняются местами, в диапазоне и т. Д.). Кроме того, в malloc вы получаете sizeof CLLocationCoordinate2D, но массив содержит структуры MKMapPoint. Эти две структуры не одно и то же, но они имеют одинаковый размер, поэтому вы не видите никаких проблем. – Anna

+0

Да, viewForOverlay не вызывается, лат и длинны верны. Этот метод делегата отлично работает в другом контроллере View ... но не работает в ячейке uitableview – Bene

ответ

5

Попробуйте это, у меня была такая же проблема. После нескольких комбинаций это работает.

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 

@interface MapViewController : UIViewController<MKMapViewDelegate> { 

    MKMapView *mapView; 
} 

и реализация ...

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    mapView = [[MKMapView alloc] initWithFrame: CGRectMakeFullScreenIphone]; 
    mapView.delegate = self; 
    [mapView setMapType: MKMapTypeStandard]; 
    [self.view addSubview: mapView]; 


    MKCoordinateRegion newRegion; 
    // configure region... 
    [mapView setRegion:newRegion animated:YES]; 

    CLLocationCoordinate2D coordinate; 
    //configure coordinate... 

    MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init]; 
    [annotation setCoordinate:coordinate]; 
    [annotation setTitle:@"TEST"]; 
    [mapView addAnnotation:annotation]; 
} 

Простой код выше работает отлично и методы делегата были названы.

0

если вы запускаете приложение в симуляторе, то метод

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay 

этот делегат не дозвонились, вам нужно запустить его на IOS устройств.

0

Первый Мет является

MAPview: regionDidChangeAnimated:

и второй

MAPview: didUpdateUserLocation:

Заголовочный файл

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 

@interface ViewController : UIViewController <MKMapViewDelegate> 
@property (weak, nonatomic) IBOutlet MKMapView *mapView; 
@property (weak, nonatomic) IBOutlet UIButton *searchButton; 

@end 

Реализация файла

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.mapView.delegate = self; 
    self.mapView.mapType = MKMapTypeStandard; 
    self.mapView.showsUserLocation = YES; 
    self.searchButton.hidden = YES; 
} 

- (IBAction)setMapType:(UISegmentedControl *)sender { 
    switch (sender.selectedSegmentIndex) { 
     case 0: 
      self.mapView.mapType = MKMapTypeStandard; 
      break; 
     case 1: 
      self.mapView.mapType = MKMapTypeSatellite; 
      break; 
     case 2: 
      self.mapView.mapType = MKMapTypeHybrid; 
      break; 
     default: 
      break; 
    } 
} 

- (IBAction)zoomToCurrentLocation:(UIBarButtonItem *)sender { 
    float spanX = 0.00725; 
    float spanY = 0.00725; 
    MKCoordinateRegion region; 
    region.center.latitude = self.mapView.userLocation.coordinate.latitude; 
    region.center.longitude = self.mapView.userLocation.coordinate.longitude; 
    region.span.latitudeDelta = spanX; 
    region.span.longitudeDelta = spanY; 
    self.searchButton.hidden = YES; 
    [self.mapView setRegion:region animated:YES]; 
} 

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 
    self.searchButton.hidden = NO; 
} 

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    [self.mapView setCenterCoordinate:userLocation.coordinate animated:YES]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
Смежные вопросы