Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

detailCalloutAccessoryView #44

Merged
merged 4 commits into from
Apr 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Sources/Annotations/MKMapAnnotationView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,23 @@
import MapKit
import SwiftUI

class MKMapAnnotationView<Content: View>: MKAnnotationView {
class MKMapAnnotationView<Content: View, DetailCalloutAccessoryView: View>: MKAnnotationView {

// MARK: Stored Properties

private var controller: NativeHostingController<Content>?

// MARK: Methods

func setup(for mapAnnotation: ViewMapAnnotation<Content>) {
func setup(for mapAnnotation: ViewMapAnnotation<Content, DetailCalloutAccessoryView>) {
annotation = mapAnnotation.annotation
clusteringIdentifier = mapAnnotation.clusteringIdentifier

if let detailCalloutAccessoryViewValue = mapAnnotation.detailCalloutAccessoryView {
canShowCallout = true
detailCalloutAccessoryView = NativeHostingController(rootView: detailCalloutAccessoryViewValue).view
}

let controller = NativeHostingController(rootView: mapAnnotation.content)
addSubview(controller.view)
bounds.size = controller.preferredContentSize
Expand Down
13 changes: 10 additions & 3 deletions Sources/Annotations/MapMarker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import MapKit
import SwiftUI

@available(macOS 11, *)
public struct MapMarker {
public struct MapMarker<DetailCalloutAccessoryView: View> {

// MARK: Nested Types

Expand All @@ -34,22 +34,25 @@ public struct MapMarker {
private let coordinate: CLLocationCoordinate2D
private let tint: Color?
private let nativeTint: NativeColor?
private let detailCalloutAccessoryView: DetailCalloutAccessoryView?
public let annotation: MKAnnotation

// MARK: Initialization

public init(coordinate: CLLocationCoordinate2D, tint: NativeColor? = nil) {
public init(coordinate: CLLocationCoordinate2D, tint: NativeColor? = nil, detailCalloutAccessoryView: DetailCalloutAccessoryView? = nil) {
self.coordinate = coordinate
self.tint = nil
self.nativeTint = tint
self.detailCalloutAccessoryView = detailCalloutAccessoryView
self.annotation = Annotation(coordinate)
}

@available(iOS 14, tvOS 14, *)
public init(coordinate: CLLocationCoordinate2D, tint: Color?) {
public init(coordinate: CLLocationCoordinate2D, tint: Color?, detailCalloutAccessoryView: DetailCalloutAccessoryView? = nil) {
self.coordinate = coordinate
self.tint = tint
self.nativeTint = nil
self.detailCalloutAccessoryView = detailCalloutAccessoryView
self.annotation = Annotation(coordinate)
}

Expand All @@ -69,6 +72,10 @@ extension MapMarker: MapAnnotation {
public func view(for mapView: MKMapView) -> MKAnnotationView? {
let view = mapView.dequeueReusableAnnotationView(withIdentifier: Self.reuseIdentifier, for: annotation)
view.annotation = annotation
if let detailCalloutAccessoryViewValue = detailCalloutAccessoryView {
view.canShowCallout = true
view.detailCalloutAccessoryView = NativeHostingController(rootView: detailCalloutAccessoryViewValue).view
}
if let marker = view as? MKMarkerAnnotationView {
if #available(iOS 14, tvOS 14, *), let tint = tint {
marker.markerTintColor = .init(tint)
Expand Down
13 changes: 10 additions & 3 deletions Sources/Annotations/MapPin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ extension MapPin: MapAnnotation {

#else

public struct MapPin {
public struct MapPin<DetailCalloutAccessoryView: View> {

// MARK: Nested Types

Expand All @@ -62,20 +62,23 @@ public struct MapPin {

private let coordinate: CLLocationCoordinate2D
private let tint: Color?
private let detailCalloutAccessoryView: DetailCalloutAccessoryView?
public let annotation: MKAnnotation

// MARK: Initialization

public init(coordinate: CLLocationCoordinate2D) {
public init(coordinate: CLLocationCoordinate2D, detailCalloutAccessoryView: DetailCalloutAccessoryView? = nil) {
self.coordinate = coordinate
self.tint = nil
self.detailCalloutAccessoryView = detailCalloutAccessoryView
self.annotation = Annotation(coordinate)
}

@available(iOS 14, macOS 11, tvOS 14, *)
public init(coordinate: CLLocationCoordinate2D, tint: Color?) {
public init(coordinate: CLLocationCoordinate2D, tint: Color?, detailCalloutAccessoryView: DetailCalloutAccessoryView? = nil) {
self.coordinate = coordinate
self.tint = tint
self.detailCalloutAccessoryView = detailCalloutAccessoryView
self.annotation = Annotation(coordinate)
}

Expand All @@ -94,6 +97,10 @@ extension MapPin: MapAnnotation {
public func view(for mapView: MKMapView) -> MKAnnotationView? {
let view = mapView.dequeueReusableAnnotationView(withIdentifier: Self.reuseIdentifier, for: annotation)
view.annotation = annotation
if let detailCalloutAccessoryViewValue = detailCalloutAccessoryView {
view.canShowCallout = true
view.detailCalloutAccessoryView = NativeHostingController(rootView: detailCalloutAccessoryViewValue).view
}
if #available(iOS 14, macOS 11, tvOS 14, *), let tint = tint, let pin = view as? MKPinAnnotationView {
pin.pinTintColor = .init(tint)
}
Expand Down
13 changes: 9 additions & 4 deletions Sources/Annotations/ViewMapAnnotation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
import MapKit
import SwiftUI

public struct ViewMapAnnotation<Content: View>: MapAnnotation {
public struct ViewMapAnnotation<Content: View, DetailCalloutAccessoryView: View>: MapAnnotation {

// MARK: Nested Types

private class Annotation: NSObject, MKAnnotation {
class Annotation: NSObject, MKAnnotation {

// MARK: Stored Properties

Expand All @@ -35,13 +35,14 @@ public struct ViewMapAnnotation<Content: View>: MapAnnotation {
// MARK: Static Functions

public static func registerView(on mapView: MKMapView) {
mapView.register(MKMapAnnotationView<Content>.self, forAnnotationViewWithReuseIdentifier: reuseIdentifier)
mapView.register(MKMapAnnotationView<Content, DetailCalloutAccessoryView>.self, forAnnotationViewWithReuseIdentifier: reuseIdentifier)
}

// MARK: Stored Properties

public let annotation: MKAnnotation
let clusteringIdentifier: String?
let detailCalloutAccessoryView: DetailCalloutAccessoryView?
let content: Content

// MARK: Initialization
Expand All @@ -50,20 +51,24 @@ public struct ViewMapAnnotation<Content: View>: MapAnnotation {
coordinate: CLLocationCoordinate2D,
title: String? = nil,
subtitle: String? = nil,
detailCalloutAccessoryView: DetailCalloutAccessoryView? = nil,
clusteringIdentifier: String? = nil,
@ViewBuilder content: () -> Content
) {
self.annotation = Annotation(coordinate: coordinate, title: title, subtitle: subtitle)
self.detailCalloutAccessoryView = detailCalloutAccessoryView
self.clusteringIdentifier = clusteringIdentifier
self.content = content()
}

public init(
annotation: MKAnnotation,
detailCalloutAccessoryView: DetailCalloutAccessoryView? = nil,
clusteringIdentifier: String? = nil,
@ViewBuilder content: () -> Content
) {
self.annotation = annotation
self.detailCalloutAccessoryView = detailCalloutAccessoryView
self.clusteringIdentifier = clusteringIdentifier
self.content = content()
}
Expand All @@ -74,7 +79,7 @@ public struct ViewMapAnnotation<Content: View>: MapAnnotation {
let view = mapView.dequeueReusableAnnotationView(
withIdentifier: Self.reuseIdentifier,
for: annotation
) as? MKMapAnnotationView<Content>
) as? MKMapAnnotationView<Content, DetailCalloutAccessoryView>

view?.setup(for: self)
return view
Expand Down
8 changes: 4 additions & 4 deletions Sources/Map/Map.swift
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ extension Map where AnnotationItems == [IdentifiableObject<MKAnnotation>] {
annotations: [MKAnnotation] = [],
@MapAnnotationBuilder annotationContent: @escaping (MKAnnotation) -> MapAnnotation = { annotation in
assertionFailure("Please provide an `annotationContent` closure for the values in `annotations`.")
return ViewMapAnnotation(annotation: annotation) {}
return ViewMapAnnotation<EmptyView, EmptyView>(annotation: annotation) {}
},
@OptionalMapAnnotationBuilder clusterAnnotation: @escaping (MKClusterAnnotation) -> MapAnnotation? = { _ in nil },
overlayItems: OverlayItems,
Expand Down Expand Up @@ -429,7 +429,7 @@ extension Map where AnnotationItems == [IdentifiableObject<MKAnnotation>] {
annotations: [MKAnnotation] = [],
@MapAnnotationBuilder annotationContent: @escaping (MKAnnotation) -> MapAnnotation = { annotation in
assertionFailure("Please provide an `annotationContent` closure for the values in `annotations`.")
return ViewMapAnnotation(annotation: annotation) {}
return ViewMapAnnotation<EmptyView, EmptyView>(annotation: annotation) {}
},
@OptionalMapAnnotationBuilder clusterAnnotation: @escaping (MKClusterAnnotation) -> MapAnnotation? = { _ in nil },
overlayItems: OverlayItems,
Expand Down Expand Up @@ -840,7 +840,7 @@ extension Map
annotations: [MKAnnotation] = [],
@MapAnnotationBuilder annotationContent: @escaping (MKAnnotation) -> MapAnnotation = { annotation in
assertionFailure("Please provide an `annotationContent` closure for the values in `annotations`.")
return ViewMapAnnotation(annotation: annotation) {}
return ViewMapAnnotation<EmptyView, EmptyView>(annotation: annotation) {}
},
@MapAnnotationBuilder clusterAnnotation: @escaping (MKClusterAnnotation) -> MapAnnotation? = { _ in nil },
overlays: [MKOverlay] = [],
Expand Down Expand Up @@ -876,7 +876,7 @@ extension Map
annotations: [MKAnnotation] = [],
@MapAnnotationBuilder annotationContent: @escaping (MKAnnotation) -> MapAnnotation = { annotation in
assertionFailure("Please provide an `annotationContent` closure for the values in `annotations`.")
return ViewMapAnnotation(annotation: annotation) {}
return ViewMapAnnotation<EmptyView, EmptyView>(annotation: annotation) {}
},
@MapAnnotationBuilder clusterAnnotation: @escaping (MKClusterAnnotation) -> MapAnnotation? = { _ in nil },
overlays: [MKOverlay] = [],
Expand Down