我无法在MapKit中的地图上显示MKAnnotationViews。我正在使用iOS 7,现在已经在论坛和网络上搜索了几个小时,尝试了不同的示例和设置。
下面我有最基本的设置(我认为)可以使它工作。该应用程序包含一个ViewController,其工具栏顶部有一个按钮,其余的是MapView。该按钮触发方法zoomToUser:(UIBarButtonItem *)sender。右键单击并检查我的网点和代表似乎是正确的。我有一些NSLog语句被触发输出一些调试信息。
首先是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: %f x %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告诉我它有注释,它要求视图,它获取视图,但它没有显示它?
答案 0 :(得分:9)
在viewForAnnotation
中,代码正在为MKAnnotationView
类型的注释创建并返回Data
。
默认情况下,MKAnnotationView
类会创建一个空视图
也就是说,它的image
属性为nil
,视图基本上不包含任何内容
因此,按原样,正在创建和添加注释视图,但它们是不可见的。
你可以:
在image
上设置MKAnnotationView
属性:
annov.image = [UIImage imageNamed:@"something"];
或者,更简单的是,创建一个MKPinAnnotationView
,它是MKAnnotationView
的一个方便的子类,可以为您显示一个图像:
MKPinAnnotationView *annov = (MKPinAnnotationView *)[mapView dequeue...
if(!annov)
{
annov = [[MKPinAnnotationView alloc]initWithAnnotation:annotation
reuseIdentifier:reuseId];
annov.pinColor = MKPinAnnotationColorRed; //or Green or Purple
}
else
...
的相依强>:
您已经创建了自定义注记类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];