MKPinAnnotationView 颜色不起作用

Posted

技术标签:

【中文标题】MKPinAnnotationView 颜色不起作用【英文标题】:MKPinAnnotationView color is not working 【发布时间】:2014-03-02 11:50:02 【问题描述】:

我正在尝试显示数组中的一些引脚,它显示了所有引脚,但它们是红色的,而不是我要求的绿色。

为什么会这样?

 //run on array to get all locations
for(int k=0;k<[array count];k=k+2)


        float targetlat=[[array objectAtIndex:k] floatValue];
        float targetlongi=[[array objectAtIndex:k+1] floatValue];
        CLLocationCoordinate2D location =  CLLocationCoordinate2DMake(targetlat,targetlongi);
        NSString *partyTitle = @"title";
        MKPinAnnotationView *partyPin = [self returnPointView:location andTitle:partyTitle andColor:MKPinAnnotationColorGreen];
        [self.mapView addAnnotation:partyPin.annotation];



   //function callback is working but its red, and it takes so much time to load
-(MKPinAnnotationView*) returnPointView: (CLLocationCoordinate2D) location andTitle: (NSString*) title andColor: (int) color



    MKCoordinateRegion region = self.mapView.region;
    region.center = location;
    region.span.longitudeDelta /= 5.0;
    region.span.latitudeDelta /= 5.0;
    [self.mapView setRegion:region];

    MKPointAnnotation *resultPin = [[MKPointAnnotation alloc] init];
    MKPinAnnotationView *result = [[MKPinAnnotationView alloc] initWithAnnotation:resultPin reuseIdentifier:Nil];
    [resultPin setCoordinate:location];
    resultPin.title = title;
    result.pinColor = color;
    return result;

【问题讨论】:

动画也不适用于 result.animatesDrop=yes; .看来他连我的财产都不在乎 (int) color 试试这个到NSUInteger thanx 也尝试直接分配没有结果的值,并且放置动画也不起作用 【参考方案1】:

关于引脚是红色而不是绿色的主要问题:

代码创建了一个MKPinAnnotationView,但此视图从未提供给地图视图。 要使地图视图使用您创建的注释视图,您必须实现 viewForAnnotation 委托方法并从那里返回它们。 否则,地图视图不知道您创建的注释视图。 如果不实现viewForAnnotation,地图视图会创建一个默认的红色图钉视图。

关于“加载时间太长”的第二个问题:

最可能的原因是您在添加注释时每次调用setRegion。 例如,如果您要添加 500 个注释,则地图视图会将区域设置 500 次。 请注意,无需调用setRegion 来添加注释(无论当前可见区域如何)。注释的坐标不是必须是“可见的”才能在此处添加注释。

您想要在for 循环内做的只是构造一个包含所有注释的区域,然后调用setRegion(或setVisibleRect一次after 所有注释都被添加(在for 循环之后)。构造MKMapRect 并调用setVisibleMapRect 比构造MKCoordinateRegion 以调用setRegion 更容易。

ios 7 中,这更简单:只需调用 showAnnotations(无需手动构建)。

示例:

//Initialize the MKMapRect (region) we want to show to null...
MKMapRect showMapRect = MKMapRectNull;

for(int k=0;k<[array count];k=k+2)

    float targetlat=[[array objectAtIndex:k] floatValue];
    float targetlongi=[[array objectAtIndex:k+1] floatValue];
    CLLocationCoordinate2D location =  CLLocationCoordinate2DMake(targetlat,targetlongi);
    NSString *partyTitle = @"title";

    //Here, don't create the annotation view.
    //Just create the annotation...
    MKPointAnnotation *resultPin = [[MKPointAnnotation alloc] init];
    [resultPin setCoordinate:location];
    resultPin.title = partyTitle;
    [self.mapView addAnnotation:resultPin];

    //Add this annotation's coordinate
    //to the MKMapRect we want to show...
    MKMapPoint annMapPoint = MKMapPointForCoordinate(location);
    MKMapRect annMapRect = MKMapRectMake(annMapPoint.x, annMapPoint.y, 0, 0);
    showMapRect = MKMapRectUnion(showMapRect, annMapRect);


mapView.visibleMapRect = showMapRect;

//In iOS 7, instead of constructing MKMapRect manually,
//we could just call showAnnotations...
//[mapView showAnnotations:mapView.annotations animated:YES];


//Implement the viewForAnnotation delegate method...
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

    //if annotation is the user location,
    //return nil so map view shows default view for it (blue dot)...
    if ([annotation isKindOfClass:[MKUserLocation class]])
    
        return nil;
    

    static NSString *reuseId = @"pin";
    MKPinAnnotationView *pav = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (pav == nil)
    
        pav = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];
        pav.canShowCallout = YES;
        pav.animatesDrop = YES;
        pav.pinColor = MKPinAnnotationColorGreen;
    
    else
    
        pav.annotation = annotation;
    

    return pav;

【讨论】:

当然,不要忘记设置/连接地图视图的delegate,否则委托方法将不会被调用。

以上是关于MKPinAnnotationView 颜色不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自定义 MKPinAnnotationView 颜色

MKPinAnnotationView 的不同颜色取决于时间

IOS:MKPinAnnotationView 动画放置不起作用

可拖动的 MKPinAnnotationView 不起作用。 draggable = YES,callout有title和subtitle,setCoordinate实现

带有图像的 MKPinAnnotationView 内的 UIButton

更改选择标签下特定选项的颜色