我需要从MKAnnotationView派生一个新类,就像在Apple的WeatherMap项目中一样,但是通过NIB文件定义图形部分:有没有办法做到这一点?我是否必须创建一个新的控制器?
答案 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" }
}
}
就是这样,视图将被正确地重用。无需将视图添加为子视图等等。