Заголовок MKMarkerAnnotationView не отображается на изображении MKSnapShot

Я пытаюсь нарисовать маркер на изображении (MKSnapshot) с заголовком, но заголовок не отображается.
Кто-нибудь знает, почему это так?

let annotation = MKPointAnnotation()
    annotation.coordinate = location
    annotation.title = "TitleTest"
let pinView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "test")
    pinView.titleVisibility = MKFeatureVisibility.visible
    pinView.dragState = .none
    pinView.animatesWhenAdded = false
    pinView.canShowCallout = false
    pinView.titleVisibility = .visible
    pinView.contentMode = .scaleAspectFit
    pinView.bounds = CGRect(x: 0, y: 0, width: 40, height: 40)
    if rect!.contains(point) {
        let pinCenterOffset = pinView.centerOffset
        point.x -= pinView.bounds.size.width / 2
        point.y -= pinView.bounds.size.height / 2
        point.x += pinCenterOffset.x
        point.y += pinCenterOffset.y
    }
    pinView.drawHierarchy(in: CGRect(
            x:point.x,
            y:point.y,
            width:pinView.bounds.width,
            height:pinView.bounds.height),
        afterScreenUpdates: true)
    print("Draw a marker on iOS 11")

Это скриншот моего UIImageView с маркером, но без заголовка:

Скриншот моего UIImageView с маркером, но без заголовка


person Joost van den Akker    schedule 06.03.2018    source источник


Ответы (1)


Заголовок можно нарисовать на снимке ниже расположения булавки:

  • определить положение аннотации в системе координат изображения snapshot.point(for: annotation.coordinate)

  • создайте атрибуты для текста заголовка, вы можете сделать его похожим на то, что использует Apple:

    private func titleAttributes() -> [NSAttributedStringKey: NSObject] {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = .center
        let titleFont = UIFont.systemFont(ofSize: 10, weight: UIFont.Weight.semibold)
        let attrs = [NSAttributedStringKey.font: titleFont,
                     NSAttributedStringKey.paragraphStyle: paragraphStyle]
        return attrs
    }
    
  • нарисуйте его прямо под положением аннотации:

    private func drawTitle(title: String,
                           at point: CGPoint,
                           attributes: [NSAttributedStringKey: NSObject]) {
        let titleSize = title.size(withAttributes: attributes)
        title.draw(with: CGRect(
            x: point.x - titleSize.width / 2.0,
            y: point.y + 1,
            width: titleSize.width,
            height: titleSize.height),
                   options: .usesLineFragmentOrigin,
                   attributes: attributes,
                   context: nil)
    }
    

Более полный пример с кодом и снимком экрана см. в мой следующий ответ (он рисует пользовательское изображение булавки, но остальная часть код можно использовать здесь).

person Stephan Schlecht    schedule 08.03.2018