gpt4 book ai didi

ios - MapKit 注释未显示在 map 上

转载 作者:可可西里 更新时间:2023-11-01 04:23:40 25 4
gpt4 key购买 nike

我无法让 MKAnnotationViews 显示在 MapKit 的 map 上。我使用的是 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 方法在请求时在控制台中打印注释标题,并且每次 map 平移该区域时,它都会打印。

按下 BarButton 并触发 zoomToUser: - 方法记录 map 确实有两个注释,MKUserLocation 和我添加的那个。

为什么我的 MapView 告诉我它有注释,它请求 View ,它获取了 View ,但它不显示它?

最佳答案

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

默认情况下,MKAnnotationView 类会创建一个空 View 。
也就是说,它的image属性是nil, View 基本上不包含任何内容。
因此,按原样,正在创建和添加注释 View ,但它们是不可见的。

您可以:

  • 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,这很好,但如果您只需要三个属性 titlesubtitle 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];

关于ios - MapKit 注释未显示在 map 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20460541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com