派生MKAnnotationView并将其链接到NIB文件

时间:2011-08-08 15:35:15

标签: ios mkannotationview

我需要从MKAnnotationView派生一个新类,就像在Apple的WeatherMap项目中一样,但是通过NIB文件定义图形部分:有没有办法做到这一点?我是否必须创建一个新的控制器?

2 个答案:

答案 0 :(得分:13)

一种方法是从笔尖加载视图,然后将视图作为子视图添加到MKAnnotationView。您无需创建任何新控制器。

首先,创建一个MKAnnotationView子类,其中包含一个属性,您将在其中加载NIB的自定义视图:

@interface MapAnnotationView : MKAnnotationView 

@property (nonatomic, retain) IBOutlet UIView* loadedView;

然后,在此类的init方法中,加载nib并添加为子视图:

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString*)reuseIdentifier
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if (self != nil)
    {
        [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil];
        if (loadedView){
            [self addSubview:loadedView];
        }
    }
    return self;
}

最后,创建MyCustomView NIB(作为UIView)。使文件的所有者成为上面的MapAnnotationView类,并将视图附加到上面定义的IBOutlet。

就是这样。

答案 1 :(得分:4)

Aidan的解决方案的一个问题是它从nib加载视图,然后将其添加为自定义AnnotationView的子视图。这将为您在地图视图上创建的每个可见注释创建一个额外的视图。如果你只有一个注释,那么它可能并不重要。但是如果你在地图上同时有几十个注释,那么这个解决方案就会浪费内存和GPU渲染资源。

更简单,更有效的解决方案是覆盖自定义reuseIdentifier中的MapAnnotationView getter方法,如下所示:

class MapAnnotationView: MKAnnotationView {
    override var reuseIdentifier: String? {
        get { return "MapAnnotationView" }
    }
}

就是这样,视图将被正确地重用。无需将视图添加为子视图等等。