ios - 使用 MKAnnotationView 委托(delegate)时引脚消失

标签 ios objective-c mapkit mkannotationview

我的 MKAnnotationView 委托(delegate)方法已被调用,因为我可以看到我的 NSLog 输出。但是,图钉没有出现在 map 上。我在这里遗漏了什么吗?

MapViewController.h

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

@interface MapViewController : UIViewController <MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *nearbyMapView;
@end

MapViewController.m

#import "MapViewController.h"
#import "AppDelegate.h"

@interface MapViewController ()

@end

@implementation MapViewController
AppDelegate *appDelegate;

- (void)viewDidLoad
{
    [super viewDidLoad];    
    appDelegate=[[UIApplication sharedApplication] delegate];
    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(54.995184, -1.566699);
    MKCoordinateSpan span = MKCoordinateSpanMake(0.5, 0.5);
    MKCoordinateRegion regionToDisplay = MKCoordinateRegionMake(center, span);
    [self.nearbyMapView setRegion: regionToDisplay];

    for (int i = 0; i < [[appDelegate offersFeeds] count]; i++) {
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        NSString *plotAddress = [[[appDelegate offersFeeds] objectAtIndex:i] valueForKey:@"addressline"];
        NSString *plotTitle = [[[appDelegate offersFeeds] objectAtIndex:i] valueForKey:@"title"];

        [geocoder geocodeAddressString:plotAddress completionHandler:^(NSArray *placemarks, NSError *error) {
            if (placemarks && placemarks.count > 0)
            {
                CLPlacemark *topResult = [placemarks objectAtIndex:0];
                MKPlacemark *placemark = [[MKPlacemark alloc]initWithPlacemark:topResult];

                MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];
                pa.coordinate = placemark.location.coordinate;
                pa.title = plotTitle;

                [self.nearbyMapView addAnnotation:pa];
            }
        }];
    }
}

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

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    MKAnnotationView *pinView = nil;

    static NSString *defaultPinID = @"identifier";
    pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
    if ( pinView == nil ) {
        NSLog(@"Inside IF");
        pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID];
        pinView.enabled = YES;
        pinView.canShowCallout = YES;
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];    
        //Accessoryview for the annotation view in ios.
        pinView.rightCalloutAccessoryView = btn;
    }
    else {
        pinView.annotation = annotation;
    }
    pinView.annotation = annotation;
    return pinView;
}

@end

最佳答案

viewForAnnotation 中,代码正在创建一个 MKAnnotationView 但没有为其设置一个 imageMKAnnotationView 上没有默认的 image,因此注释是不可见的。

当您根本不实现委托(delegate)时, map View 会为您创建带有红色图钉颜色的MKPinAnnotationViewMKPinAnnotationViewMKAnnotationView 的一个方便的子类,它提供图钉图像(三种颜色之一)。

当您实现委托(delegate)时,您需要创建正确的 View 并根据需要设置属性。

要么创建一个 MKPinAnnotationView(它提供默认的图钉图像),要么在普通 MKAnnotationView 上设置 image 属性。

要使用MKPinAnnotationView:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id             <MKAnnotation>)annotation
{
    MKPinAnnotationView *pinView = nil;

    static NSString *defaultPinID = @"identifier";
    pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
    if ( pinView == nil )
    {
        NSLog(@"Inside IF");
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID];

        pinView.pinColor = MKPinAnnotationColorRed;  //or Green or Purple

        pinView.enabled = YES;
        pinView.canShowCallout = YES;

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

        //Accessoryview for the annotation view in ios.
        pinView.rightCalloutAccessoryView = btn;
    }
    else
    {
        pinView.annotation = annotation;
    }

    return pinView;
}

或者使用 MKAnnotationView 和你自己的 image:

//same code as the current but add this line
//after the initWithAnnotation:
pinView.image = [UIImage imageNamed:@"SomeImage.png"];

关于ios - 使用 MKAnnotationView 委托(delegate)时引脚消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19640858/

相关文章:

ios - 为什么看不到按钮?

objective-c - 注释太小 iOS

ios - 设置自定义 MKPinAnnotationView 图像

ios - 多声道音频 iOS(需要 4 个同时输入)

ios - 在 iOS 6 中将 5112225.14 转换为 5,112,225.14

ios - 堆栈 View 中的对齐方式

ios - 为什么我调用这个方法然后当前VC自动回到rootVC

ios - 制作新项目时苹果男子气概链接器错误

ios - 无法在 iOS 设备中写入大文件(> 200MB,在我的情况下为 700MB)?

iphone - 如何在 map 注释 View 中找出引脚 ID?