Giter Site home page Giter Site logo

swiftui-mapkit-callout's Introduction

swiftui-mapkit-callout

This is a simple class to add a SwiftUI View inside an MKAnnotationView.detailCalloutAccessoryView property.

Yes, you can technically set .canShowCallout to false and create your own completely custom callout, but you'd have to draw your own bubble, position it manually and who knows what can happen in the future.

I wanted to avoid doing that, and wanted to avoid using UIKit.

Usage

  • Copy the MapCalloutView file located inside the MapViews folder into your project.
  • Inside the mapView:viewFor:annotation method, create or reuse an MKAnnotationView as normal
  • Set .canShowCallout to true on your MKAnnotationView
  • Create your SwiftUI View as normal
  • Pass your created view in the initializer for MapCalloutView, making sure it's type casted to AnyView
  • Pass your instance of MapCalloutView to detailCalloutAccessoryView

Example

view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view?.canShowCallout = true

//create any SwiftUI View you like
let customView = Text("This is a SwiftUI Text View")

//create an instance of MapCalloutView
let callout = MapCalloutView(rootView: AnyView(customView))

//pass it to detailCalloutAccessoryView
view?.detailCalloutAccessoryView = callout

The sample project includes initializations of a few different kind of views.

Tips & Tricks

  • I'd recommend setting a maxHeight and maxWidth to the .frame of your SwiftUI View
  • The left and right callout accessory views will work as expected
  • If title is set on the annotation, it will be displayed above your SwiftUI View. I haven't figured out a way to hide this. If you have any thoughts, would love to hear them!

swiftui-mapkit-callout's People

Contributors

khuffie avatar

Stargazers

zydeman avatar  avatar Roman Podymov avatar  avatar Alessandro Aresta avatar Mark Powell avatar  avatar akatzfey avatar Serhiy Butz avatar nzopandolfi avatar Nao Ohta avatar Oops avatar Jimmy Horan avatar  avatar Matthew White avatar  avatar DanMark avatar Kevin avatar

Watchers

 avatar

swiftui-mapkit-callout's Issues

Project License

Please add a LICENSE file to this project. I'd suggest that the MIT License would be appropriate.

Callout View is misplaced after map is dragged

Hi,
I'm trying to use this to add a SwiftUI view to the MKAnnotationView's detailCalloutAccessoryView. It works fine at first, but if the annotation is presented and the user drags the MKMapView around, the callout bubble looks fine but the detailCalloutAccessoryView doesn't move along with it! With views with buttons on it, it becomes a problem since the tap targets are different than what is showing on screen.

This is from the sample code, after dragging the map while the button test was visible:
Screen Shot 2021-03-26 at 6 30 34 PM

The only work-around I've found so far is to detect the drags in MKMapView's regionDidChangeAnimated delegate call and then de-select the selected annotation. But it's not idea.

Any idea how to fix this properly?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.