MKAnnotationView标注的自定义字体

dji*_*i33 2 objective-c mkmapview mkannotationview ios mkmapviewdelegate

幸运的是,一个标准的标注视图MKAnnotationView满足我们的需要- ,title,subtitle,leftCalloutAccessoryViewrightCalloutAccessoryView.

不幸的是,我们在应用程序中使用自定义字体,并希望将这些自定义字体扩展到这些标注.

MKAnnotationView没有提供完成此任务的标准方法.

如何在MKAnnotation标注视图中使用自定义字体?

Ryu*_*X51 7

因为我需要Swift版本 - 就在这里.此外,您必须在didAddSubview()上调用setNeedsLayout(),否则当您取消选择并重新选择注释时,不会调用layoutSubviews()并且callout具有其旧字体.

// elsewhere, in a category on UIView.
// thanks to this answer: http://stackoverflow.com/a/25877372/607876

typealias ViewBlock = (_ view: UIView) -> Bool

extension UIView {
  func loopViewHierarchy(block: ViewBlock?) {

    if block?(self) ?? true {
      for subview in subviews {
        subview.loopViewHierarchy(block: block)
      }
    }
  }
}

// then, in your MKAnnotationView subclass

class CustomFontAnnotationView: MKAnnotationView {

  override func didAddSubview(_ subview: UIView) {
    if isSelected {
      setNeedsLayout()
    }
  }

  override func layoutSubviews() {

    // MKAnnotationViews only have subviews if they've been selected.
    // short-circuit if there's nothing to loop over

    if !isSelected {
      return
    }

    loopViewHierarchy { (view: UIView) -> Bool in
      if let label = view as? UILabel {
        label.font = labelFont
        return false
      }
      return true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)