设置自定义MKPinAnnotationView图像

时间:2014-06-08 07:06:38

标签: ios mapkit

我正在尝试根据某些条件为MKPinAnnotationView创建三个自定义图钉注释。在这种情况下,我正在迭代自行车站对象的for循环,检查可用自行车的数量是否为0,如果是,则设置一个pin.image,如果没有,则设置另一个pin.image。我还在检查码头的数量是否为0并相应地设置另一个图像。我知道,在某些情况下,第一个if语句的计算结果为YES,但是所有的pin注释都会出现在语句的else部分中表示的图像。我想我很困惑在哪里实例化MKAnnotationView并返回它,以便我所有的pin图像都没有返回相同的图像,就像现在一样。

       - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
       for (DivvyStation *divvyStation in self.divvyStations) {
        if (divvyStation.availableBikes.intValue < 1) {
                MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
                pin.canShowCallout = YES;
                pin.image = [UIImage imageNamed:@"nobikes"];
                return pin; }
        else if (divvyStation.availableDocks.intValue < 1) {
                MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
                pin.canShowCallout = YES;
                pin.image = [UIImage imageNamed:@"dock"];
                return pin;}
        else {
            MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
            pin.canShowCallout = YES;
            pin.image = [UIImage imageNamed:@"Divvy-FB"];
            return pin;
              }
            }
   return nil;
}

好吧,我想我理解了这个问题,但我的引脚显示的是默认的红色,所以我认为我没有让自定义类正确采用MKAnnotation协议。我的自定义类.h文件如下。我读到MKAnnotation协议必须实现我已经添加的坐标属性。有什么我想念的吗?

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


@interface DivvyStation : NSObject <MKAnnotation>

@property (nonatomic) CLLocationCoordinate2D coordinate;
@property NSNumber *identifier;
@property NSString *stationName;
@property NSNumber *availableDocks;
@property NSNumber *totalDocks;
@property NSNumber *latitude;
@property NSNumber *longitude;
@property NSString *statusValue;
@property NSNumber *statusKey;
@property NSNumber *availableBikes;
@property NSString *streetAddress1;
@property NSString *streetAddress2;
@property NSString *city;
@property NSString *postalCode;
@property NSString *location;
@property NSString *landMark;

@end

1 个答案:

答案 0 :(得分:1)

您不需要在此方法中遍历所有自行车站 - 调用它以获取特定注释的引脚视图。您需要检查与传递给此方法的注释对应的工作站的自行车数量。当前编写代码的方式将返回适用于所有注释的数组中第一个工作站的视图。

您会注意到的一件事是MKAnnotation是一个协议,而不是您需要子类化的对象。这意味着您可以在数据模型中使用现有对象采用MKAnnotation协议。

在这种情况下,您可以使DivvyStation类采用MKAnnotation协议。那么这将是你的viewForAnnotation方法。

   - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

    if ([annotation isKindOfClass:[DivvyStation class]]) {

      DivvyStation *divvyStation=(DivvyStation *)annotation

      if (divvyStation.availableBikes.intValue < 1) {
            MKAnnotationView *pin = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
            pin.canShowCallout = YES;
            pin.image = [UIImage imageNamed:@"nobikes"];
            return pin; }
      else if (divvyStation.availableDocks.intValue < 1) {
            MKAnnotationView *pin = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
            pin.canShowCallout = YES;
            pin.image = [UIImage imageNamed:@"dock"];
            return pin;}
      else {
        MKAnnotationView *pin = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
        pin.canShowCallout = YES;
        pin.image = [UIImage imageNamed:@"Divvy-FB"];
        return pin;
          }
      }
      return nil;
}