Как настроить пузырь выноски для MKAnnotationView?

Это сделано во время компиляции. Это точно эквивалентно "string1string2string3".

предположим Вы имеете:

string x = "string1string2string3"
string y = "string1" + "string2" + "string3"

компилятор выполнит соответствующее интернирование таким образом, что X и Y относятся к тем же объектам.

РЕДАКТИРОВАНИЕ: существует большой разговор [приблизительно 111] в ответах и комментариях. Многие разработчики, кажется, полагают, что конкатенация строк должна всегда быть сделанной с StringBuilder. Это - сверхобобщение - это стоит понять , почему StringBuilder хорошо в некоторых ситуациях, а не в других .

88
задан Vadim Kotov 18 September 2017 в 11:16
поделиться

2 ответа

У меня была такая же проблема. В этом блоге есть множество сообщений по этой теме http://spitzkoff.com/craig/?p=81 .

Простое использование MKMapViewDelegate не помогает помочь вам здесь, и создание подкласса MKMapView и попытка расширить существующую функциональность также не сработали для меня.

В итоге я создал свой собственный CustomCalloutView , которым я являюсь имея поверх моего MKMapView . Вы можете стилизовать это представление по своему усмотрению.

Мой CustomCalloutView имеет метод, аналогичный этому:


- (void) openForAnnotation: (id)anAnnotation
{
    self.annotation = anAnnotation;
    // remove from view
    [self removeFromSuperview];

    titleLabel.text = self.annotation.title;

    [self updateSubviews];
    [self updateSpeechBubble];

    [self.mapView addSubview: self];
}

Он принимает объект MKAnnotation и устанавливает собственный заголовок, после этого он вызывает два других метода, которые довольно уродливы, которые регулируют ширину и размер содержимого выноски, а затем рисуют вокруг него речевой пузырь в правильном месте.

Наконец, представление добавляется как подпредставление к mapView. Проблема с этим решением заключается в том, что трудно удерживать выноску в правильном положении при прокрутке карты. Я просто скрываю выноску в методе делегата представлений карты при изменении региона, чтобы решить эту проблему.

Потребовалось некоторое время, чтобы решить все эти проблемы, но теперь выноска ведет себя почти как официальная, но у меня она есть в мой собственный стиль.

6
ответ дан 24 November 2019 в 07:36
поделиться

В основном, чтобы решить эту проблему, нужно: a) Не допускайте появления пузыря выноски по умолчанию. б) Выяснить, какая аннотация была нажата.

Я смог добиться этого следующим образом: а) установка для canShowCallout значения NO b) создание подкласса MKPinAnnotationView и переопределение методов touchBegan и touchesEnd.

Примечание: вам необходимо обрабатывать события касания для MKAnnotationView, а не для MKMapView

5
ответ дан 24 November 2019 в 07:36
поделиться