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

Associating a QuadTreeNode with it's parent #24

Closed
aodhol opened this issue Dec 18, 2016 · 3 comments
Closed

Associating a QuadTreeNode with it's parent #24

aodhol opened this issue Dec 18, 2016 · 3 comments

Comments

@aodhol
Copy link

aodhol commented Dec 18, 2016

Is there a way to associate a QuadTreeNode with an optional parent or 'parent' coordinate to allow that parent / coordinate to be retrieved later upon de-clustering?

i.e. associating a node with the cluster that it's contained in...

@ateliercw
Copy link
Contributor

@aodhol Not in the current implementation of the library.

Assuming this is still on the subject of attempting to animate clusters breaking into individual units, it may be worth investigating creating the annotation on the cluster annotation view, with a flag for splitting on removal (like the flag on MKPinAnnotationView for animating drop) that causes the cluster to "split" into the child annotations on removal. The actual child annotations could fade in with a delay to make them appear to be animating alongside the cluster view.

@aodhol
Copy link
Author

aodhol commented Dec 19, 2016

@ateliercw Thanks for the response! The trouble is, there's no way of telling beforehand when an annotation view will be removed. Would you suggest getting the view for an annotation that is about to be removed and manually invoking such an animation?

@ateliercw
Copy link
Contributor

ateliercw commented Dec 19, 2016

@aodhol in the demo app, I would probably insert code somewhere around here:

    func updateAnnotations(inMapView mapView: MKMapView,
                                     forMapRect root: MKMapRect) {
        guard !mapView.frame.isEmpty && !MKMapRectIsEmpty(root) else {
            mapView.removeAnnotations(mapView.annotations)
            return
        }
        let zoomScale = Double(mapView.frame.width) / root.size.width
        let clusterResults = mapData.clusteredDataWithinMapRect(root,
                                                                zoomScale: zoomScale,
                                                                cellSize: Double(MapKitViewController.cellSize))
        let newAnnotations = clusterResults.map(BaseAnnotation.makeAnnotation)

        let oldAnnotations = mapView.annotations.flatMap({ $0 as? BaseAnnotation })

        let toRemove = oldAnnotations.filter { annotation in
            return !newAnnotations.contains { newAnnotation in
                return newAnnotation == annotation
            }
        }

        // TODO: insert code to trigger an animation on any clusters that are removed

        mapView.removeAnnotations(toRemove)

        let toAdd = newAnnotations.filter { annotation in
            return !oldAnnotations.contains { oldAnnotation in
                return oldAnnotation == annotation
            }
        }

        mapView.addAnnotations(toAdd)
    }

I'm not sure if that's the right solution / place to be doing it, but it's where I would start.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants