Получение MKAnnotationView и связывание его с файлом NIB - PullRequest
1 голос
/ 08 августа 2011

Мне нужно получить новый класс из MKAnnotationView, как в проекте WeatherMap от Apple, но с графической частью, определенной в файле NIB: есть ли способ сделать это? Нужно ли создавать новый контроллер?

Ответы [ 2 ]

13 голосов
/ 11 октября 2011

Один из способов сделать это - загрузить представление из пера, а затем добавить его в качестве подпредставления к вашему MKAnnotationView.Вам не нужно создавать какие-либо новые контроллеры.

Сначала создайте свой подкласс MKAnnotationView со свойством, в которое вы будете загружать пользовательское представление NIB:

@interface MapAnnotationView : MKAnnotationView 

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

Затем вМетод init для этого класса, загрузите перо и добавьте в качестве подпредставления:

- (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;
}

Наконец, создайте свой NIB MyCustomView (как UIView).Сделайте владельцем файла вышеуказанный класс MapAnnotationView и присоедините представление к IBOutlet, определенному выше.

Вот и все.

4 голосов
/ 31 января 2016

Одна проблема с решением Aidan состоит в том, что он загружает представление из пера, а затем добавляет его как подпредставление для пользовательского AnnotationView. Это приведет к тому, что в памяти появится дополнительный вид для каждой видимой аннотации, созданной вами на виде карты. Если у вас есть только одна аннотация, то, возможно, это не имеет значения. Но если на карте одновременно находятся десятки аннотаций, то это решение - пустая трата памяти и ресурсов рендеринга с помощью графического процессора.

Более простое и эффективное решение - переопределить метод получения reuseIdentifier в пользовательском MapAnnotationView, например:

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

И это все, вид будет повторно использован правильно. Не нужно делать трюк добавления представления как подпредставления и т. Д.

...