【问题标题】:MapKit Annotations not showing up on mapMapKit 注释未显示在地图上
【发布时间】:2013-12-08 23:20:13
【问题描述】:

我无法在 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

数据.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 告诉我它有注释,它要求视图,它得到视图,但它没有显示它?

【问题讨论】:

    标签: ios mapkit mkannotation mkannotationview


    【解决方案1】:

    viewForAnnotation 中,代码为Data 类型的注释创建并返回MKAnnotationView

    MKAnnotationView 类默认创建一个空视图。
    即它的image属性为nil,视图基本不包含任何内容。
    因此,按原样创建和添加注释视图,但它们是不可见的。

    您可以:

    • MKAnnotationView 上设置image 属性:

      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,这很好,但如果您只需要三个属性titlesubtitlecoordinate,那么您可以只使用预定义的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];
    

    【讨论】:

    • 非常感谢!我真的不敢相信我错过了……我想我没有仔细查看注释视图被定制的代码部分。关于注释类:我将从核心数据中收集引脚的数据,但我认为粘贴的代码太多,但我想展示注释类的一些相关部分。它实际上是在已经分类的 NSManagedObject 子类之上使用类别来实现的。希望我可以投票,但我没有声望。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多