Zoom MKMapView to fit polyline points

后端 未结 8 1230
小蘑菇
小蘑菇 2020-12-05 04:39

I have an array, allCollections, that holds programmatically-created arrays of CLLocations the user has recorded through my iOS app. Each sub-array in allCollections holds a

相关标签:
8条回答
  • 2020-12-05 05:05

    Swift 4 / slightly modified version of fundtimer's answer.

     func setVisibleMapArea(polyline: MKPolyline, edgeInsets: UIEdgeInsets, animated: Bool = false) {
        mapView.setVisibleMapRect(polyline.boundingMapRect, edgePadding: edgeInsets, animated: animated)
    }
    

    Calling the above using a route's polyline and leaving the default of not animated, and adding small edge insets of 10 all around:

    setVisibleMapArea(polyline: route.polyline, edgeInsets: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0))
    
    0 讨论(0)
  • 2020-12-05 05:05

    I have another solution for this problem

    private func mapRegion() -> MKCoordinateRegion? {
    
    
        let latitudes = self.coordinates.map { location -> Double in
    
            return location.latitude
        }
    
        let longitudes = self.coordinates.map { location -> Double in
    
            return location.longitude
        }
    
        let maxLat = latitudes.max()!
        let minLat = latitudes.min()!
        let maxLong = longitudes.max()!
        let minLong = longitudes.min()!
    
        let center = CLLocationCoordinate2D(latitude: (minLat + maxLat) / 2,
                                            longitude: (minLong + maxLong) / 2)
        let span = MKCoordinateSpan(latitudeDelta: (maxLat - minLat) * 1.3,
                                    longitudeDelta: (maxLong - minLong) * 1.3)
        return MKCoordinateRegion(center: center, span: span)
    }
    

    Where coordinates is Array of CLLocationCoordinate2D

    Hope it is helpful to someone

    0 讨论(0)
  • 2020-12-05 05:07

    You could loop through all CLLocations recording the max/min coordinates and use that to set a view rect like they do on this question iOS MKMapView zoom to show all markers .

    Or you could go through each of your overlays and get their boundingMapRect then use MKMapRectUnion (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c/func/MKMapRectUnion) to combine them all until you have one MKMapRect that covers them all and use that to set the view.

    [mapView setVisibleMapRect:zoomRect animated:YES]
    

    This question shows a simple loop combining the maprects in unions as I suggested: MKMapRect zooms too much

    0 讨论(0)
  • 2020-12-05 05:13

    @Fundtimer pointed it right way, Only thing is that Padding needs to be adjusted as per visual needs, that way it will support all the other overlays and following is the generic solution for all overlays.

    -(void)zoomIntoExistingMapObjectForAnnot:(CustomMapAnnotation *)annot
    {
       id overlay = annot.shape;//I have overlay property in custom annotation class.
       [_mapView setVisibleMapRect:[overlay boundingMapRect] edgePadding:UIEdgeInsetsMake(150.0, 150.0, 150.0, 150.0) animated:YES];
    }
    
    0 讨论(0)
  • 2020-12-05 05:14
    -(void)zoomToPolyLine: (MKMapView*)map polyLine: (MKPolyline*)polyLine 
    animated (BOOL)animated
    {
    MKPolygon* polygon = 
        [MKPolygon polygonWithPoints:polyLine.points count:polyLine.pointCount];
    
    [map setRegion:MKCoordinateRegionForMapRect([polygon boundingMapRect]) 
         animated:animated];
    }
    
    0 讨论(0)
  • 2020-12-05 05:18

    in swift:

    if let first = mapView.overlays.first {
        let rect = mapView.overlays.reduce(first.boundingMapRect, combine: {MKMapRectUnion($0, $1.boundingMapRect)})
        mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true)
    }
    

    this will zoom/pan to fit all overlays with a little buffer

    0 讨论(0)
提交回复
热议问题