MapKit注解没有显示在地图上
我无法在MapKit的地图上显示MKAnnotationViews。 我正在使用iOS 7,现在已经在论坛和网上search了很多小时,尝试了不同的样本和设置。
下面我有最基本的设置可能(我认为)使其工作。 该应用程序包含一个单独的ViewController,顶部有一个button,剩下的就是MapView。 该button触发方法zoomToUser:(UIBarButtonItem *)发件人。 右键点击并检查我的网点和代表似乎是正确的。 我有一些NSLog语句被触发输出一些debugging信息。
首先是VC:
#import "ViewController.h" #import "Data.h" @interface ViewController () <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapView; - (IBAction)zoomToUser:(UIBarButtonItem *)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.mapView.showsUserLocation = YES; Data *ann = [[Data alloc] init]; [self.mapView addAnnotation:ann]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self zoomToUser:nil]; } -(IBAction)zoomToUser:(UIBarButtonItem *)sender { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate, 2000, 2000); NSLog(@"region: %fx %f",self.mapView.userLocation.coordinate.latitude,self.mapView.userLocation.coordinate.longitude); [self.mapView setRegion:region animated:YES ]; NSArray *arr = self.mapView.annotations; for(int i = 0, max = arr.count; i < max; i++) { id<MKAnnotation> annotation = arr[i]; NSLog(@"%d of %d: %@ (%@)",i+1,max,annotation.title, [annotation class]); } } - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation { NSString *reuseId = @"Test"; if([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } else if( [annotation isKindOfClass:[Data class]]) { MKAnnotationView *annov = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; if(!annov) { annov = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseId]; } else { annov.annotation = annotation; } annov.canShowCallout = YES; NSLog(@"Title: %@",annotation.title); return annov; } else { return nil; } } @end
和Data
类:
#import "Data.h" @implementation Data -(NSString *)title { return @"The title"; } -(NSString *)subtitle { return @"A subtitle"; } -(CLLocationCoordinate2D)coordinate { CLLocationCoordinate2D coordinate; coordinate.latitude = 60.123456; coordinate.longitude = 10.123456; return coordinate; } @end
Data.h:
#import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface Data : NSObject <MKAnnotation> @end
和ViewController.h:
#import <UIKit/UIKit.h> #import <MapKit/MapKit.h> @interface ViewController : UIViewController @end
正如你所看到的viewForAnnotation
– 方法在请求时在控制台中打印注释标题,并且每次地图平移该区域时,它都会打印。
按下BarButton并触发zoomToUser:
– 方法日志来控制地图确实有两个注释, MKUserLocation
和我添加的。
我的MapView如何告诉我它有注释,它要求视图,它获取视图,但它不显示它?
在viewForAnnotation
,代码创build并返回一个MKAnnotationView
用于Data
types的注释。
MKAnnotationView
类默认创build一个空视图。
也就是说,它的image
属性是nil
,而视图基本上不包含内容。
因此,注释视图正在被创build和添加,但是它们是不可见的。
你可以:
-
在
MKAnnotationView
上设置image
属性:annov.image = [UIImage imageNamed:@"something"];
-
或者,更简单的,创build一个
MKPinAnnotationView
而不是MKPinAnnotationView
一个方便的子类,它为您显示一个针图像:MKPinAnnotationView *annov = (MKPinAnnotationView *)[mapView dequeue... if(!annov) { annov = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseId]; annov.pinColor = MKPinAnnotationColorRed; //or Green or Purple } else ...
无关 :
你已经创build了一个自定义注释类Data
,但是如果你所需要的只是三个属性title
, subtitle
和coordinate
,那么你可以使用预定义的MKPointAnnotation
类来设置每个实例的所有属性:
MKPointAnnotation *ann = [[MKPointAnnotation alloc] init]; ann.title = @"The title"; ann.subtitle = @"A subtitle"; ann.coordinate = CLLocationCoordinate2DMake (60.123456, 10.123456); [self.mapView addAnnotation:ann];