Callout для MKPolyline - PullRequest
       8

Callout для MKPolyline

0 голосов
/ 17 апреля 2019

У меня есть короткая строка (MKPolyline) и пользовательский класс аннотаций (MKPointAnnotaion).Прямо сейчас у меня есть точечная аннотация, расположенная в средней точке полилинии.Однако я хотел бы, чтобы выноска отображалась при каждом касании любой точки на полилинии, подобно тому, как выполняется маршрутизация в Картах.Поскольку у полилиний, кажется, нет такого осязаемого атрибута, как аннотации, есть ли способ, чтобы аннотация охватывала всю строку?

Меня не волнует маркер аннотаций (на самом деле это неудобство, и я бы предпочел его скрывать), только выноска и связанная информация о классе.

Если это вообще возможно, может кто-нибудь предоставить краткий пример кода с ответом?

РЕДАКТИРОВАТЬ: Другие посты, кажется, более 5 лет назад со ссылками, которые больше не работают

1 Ответ

2 голосов
/ 18 апреля 2019

Пара мыслей:

  1. Я думаю, что ваш подход «добавить аннотацию» для того места, с которого вы хотите начать этот вызов, будет самым простым подходом.Если вы начнете размышлять над созданием подкласса вида аннотации, который показывает путь, я думаю, что он довольно быстро станет довольно сложным (работа с изменениями масштабирования, поворотами, 3D и т. Д.).Оверлеи дают вам множество вариантов поведения бесплатно, поэтому я думаю, что вы захотите придерживаться этого.Кроме того, аннотации также дают вам возможность вызывать вызовы бесплатно, поэтому я думаю, что вы захотите остаться с этим тоже.

  2. Если вы не хотите, чтобы в вашем представлении аннотаций отображался значок /маркер, просто не делайте подклассы из MKPinAnnotationView или MKMarkerAnnotationView, а просто используйте MKAnnotationView.

  3. Сложный шаг заключается в том, как обнаружить удары по MKPolylineRenderer.Одна идея состоит в том, чтобы создать путь, который очерчивает контур пути MKPolyline.

    extension MKPolyline {
        func contains(point: CGPoint, strokeWidth: CGFloat = 44, in mapView: MKMapView) -> Bool {
            guard pointCount > 1 else { return false }
    
            let path = UIBezierPath()
            path.move(to: mapView.convert(from: points()[0]))
            for i in 1 ..< pointCount {
                path.addLine(to: mapView.convert(from: points()[i]))
            }
            let outline = path.cgPath.copy(strokingWithWidth: strokeWidth, lineCap: .round, lineJoin: .round, miterLimit: 0)
            return outline.contains(point)
        }
    }
    

    где

    extension MKMapView {
        func convert(from mapPoint: MKMapPoint) -> CGPoint {
            return convert(mapPoint.coordinate, toPointTo: self)
        }            
    }
    

Затем можно создать распознаватель жестов, который обнаруживает касание, проверяет, находится ли он в пределах этого пути, обозначающий MKPolyline или что угодно.Но это основные части решения.

Очевидно, что отвечает здесь очертания по-другому, видимо, глядя на расстояние до путей.Это тоже возможно сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...