iOS Dev: использование пользовательского изображения для аннотации пользователя в MapBox - PullRequest
0 голосов
/ 26 сентября 2018

Я очень новичок в разработке IOS, поэтому некоторые из них могут показаться очевидными.Я попытался объединить примеры для , чтобы настроить пользовательскую аннотацию и , отмечающую место на карте изображением

. Мне кажется, мне нужно добавить следующие строкикода и каким-то образом прикрепить этот код к аннотации пользователя, описанной в первой ссылке, но я понятия не имею, как это сделать.Я предполагаю, что я мог бы также вставить некоторые из этих функций в customUserLocationAnnotationView, но нет никакого очевидного индикатора того, где разместить это в этом классе.

func mapView(_ mapView: MGLMapView, imageFor annotation: MGLAnnotation) -> MGLAnnotationImage? {
var annotationImage = mapView.dequeueReusableAnnotationImage(withIdentifier: "pisa")

if annotationImage == nil {
          var image = UIImage(named: "pisavector")!
          image = image.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: image.size.height/2, right: 0))
          annotationImage = MGLAnnotationImage(image: image, reuseIdentifier: "pisa")
     }
     return annotationImage
}

func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
     return true
}

EDIT

Я не просто хочу поместить изображение в случайном месте, как это

enter image description here

Я хочу, чтобы изображение было отцентрировано на пользователяаннотации, и когда пользователь перемещается, изображение также будет перемещаться, подобно изображению ниже

enter image description here

В качестве примечания

Я также получаю сообщение об ошибке «Не удалось отобразить и обновить состояние автоматической автоматической разметки для ViewController (BYZ-38-tOr): агент разбил Main.storyboard», но я не думаю, что это важно, потому что мойПрограмма все еще строит и работает на симуляторе нормально.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Этот код работает для меня (с помощью Mapbox iOS SDK 3.6.0 / Swift 4.2 / iOS 12.1).Используемое изображение - 24-битный PNG.Сохраняя его в 2 или 4 раза, номинальный размер создает чистое, не зазубренное изображение (я не могу сказать разницу между ними). ​​

sample

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
        // Substitute our custom view for the user location annotation. This custom view is defined below.
        if annotation is MGLUserLocation  { // && mapView.userLocation != nil
            let reuseIdentifier = "userLocationView"

            // For better performance, always try to reuse existing annotations.
            var userLocAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)

            // If there’s no reusable annotation view available, initialize a new one.
            if userLocAnnotationView == nil {
                userLocAnnotationView =  CustomUserLocationAnnotationView(reuseIdentifier: reuseIdentifier)
            }

            return userLocAnnotationView
        }
        else if annotation is MGLAnnotationView{
            // return another kind of annotation
        }

        return nil
    }


    class CustomUserLocationAnnotationView: MGLUserLocationAnnotationView {
        let size: CGFloat = 36
        var dot: CALayer!

        // -update is a method inherited from MGLUserLocationAnnotationView. It updates the appearance of the user location annotation when needed. This can be called many times a second, so be careful to keep it lightweight.
        override func update() {
            if frame.isNull {
                frame = CGRect(x: 0, y: 0, width: size, height: size)
                return setNeedsLayout()
            }

            setupLayers()
        }

        private func setupLayers() {
            // This dot forms the base of the annotation.
            if dot == nil {
                dot = CALayer()
                dot.bounds = CGRect(x: 0, y: 0, width: size, height: size)

                let image = UIImage(named: "locationPip")?.cgImage

                dot.contents = image

                dot.contentsScale = UIScreen.main.scale
                layer.addSublayer(dot)
            }
        }
    }
0 голосов
/ 26 сентября 2018
override func viewDidLoad() {
    super.viewDidLoad()
    let mapView = MGLMapView(frame: view.bounds)
    mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    mapView.delegate = self

    mapView.userTrackingMode = .followWithHeading
    mapView.showsUserHeadingIndicator = true
    view.addSubview(mapView)
}  

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
// Substitute our custom view for the user location annotation. This custom view is defined below.
    if annotation is MGLUserLocation && mapView.userLocation != nil {
        return CustomUserLocationAnnotationView()
    }
    return nil
}

// Create a subclass of MGLUserLocationAnnotationView.
class CustomUserLocationAnnotationView: MGLUserLocationAnnotationView {
    ...
}

Взгляните на этот пример: https://www.mapbox.com/ios-sdk/maps/examples/user-location-annotation/

В CustomUserLocationAnnotationView есть метод setupLayers.Переменная точка является CALayer, поэтому вы можете добавить UIImage к CALayer.Измените код в приватном func setupLayers (), как показано ниже:

dot = CALayer()
let myImage = UIImage(named: "star")?.cgImage
dot.contents = myImage
layer.addSublayer(dot)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...