如何按固定百分比扩展MKMapRect?

时间:2013-01-09 18:01:51

标签: objective-c mapkit

我想得到一个结果MKMapRect,它在所有方向上比当前visibleMapRect大10-20%。如果这是一个CGRect,我会使用带有负x和y值的CGRectInset,为我提供一个反向插图(即一个更大的rect)。不幸的是,MKMapInset不支持负插入值,所以它并不那么容易。

如果map rect的值是可识别单位但原点x和y值大约为4.29445e + 07,宽度/高度为2500-3000,则可能更容易。

我写一个类别手动执行此操作大约需要10秒钟,但我想确保先没有遗漏任何内容。有没有更简单的方法来扩展MKMapRect?

4 个答案:

答案 0 :(得分:26)

在iOS7中,rectForMapRect:mapRectForRect:已被弃用,现在属于MKOverlayRenderer类。我宁愿建议使用MapView mapRectThatFits: edgePadding:方法。以下是示例代码:

MKMapRect visibleRect = self.mapView.visibleMapRect;
UIEdgeInsets insets = UIEdgeInsetsMake(50, 50, 50, 50);
MKMapRect biggerRect = [self.mapView mapRectThatFits:visibleRect edgePadding:insets];

2017年最新的Swift ......

func updateMap() {

    mkMap.removeAnnotations(mkMap.annotations)
    mkMap.addAnnotations(yourAnnotationsArray)

    var union = MKMapRectNull

    for p in yourAnnotationsArray {
        // make a small, say, 50meter square for each
        let pReg = MKCoordinateRegionMakeWithDistance( pa.coordinate, 50, 50 )
        // convert it to a MKMapRect
        let r = mkMapRect(forMKCoordinateRegion: pReg)

        // union all of those
        union = MKMapRectUnion(union, r)

        // probably want to turn on the "sign" for each
        mkMap.selectAnnotation(pa, animated: false)
    }

    // expand the union, using the new #edgePadding call. T,L,B,R
    let f = mkMap.mapRectThatFits(union, edgePadding: UIEdgeInsetsMake(70, 0, 10, 35))

    // NOTE you want the TOP padding much bigger than the BOTTOM padding
    // because the pins/signs are actually very tall

    mkMap.setVisibleMapRect(f, animated: false)

}

答案 1 :(得分:5)

如何使用visibleMapRectCGRect转换为rectForMapRect:,使用CGRect获取新的CGRectInset,然后将其转换回{{1}与MKMapRect

答案 2 :(得分:0)

对Swift 4进行了精炼和更正user2285781's answer

<div id="container1" display:inline-block">
<script>
var chart_data = "{$chart_data}";

{literal}
function drawChart() {
   // Define the chart to be drawn
   var data = new google.visualization.DataTable(chart_data);
   data.addColumn('string', 'Status');
   data.addColumn('number', 'Percentage');
   /*

   data.addRows([
      ['Passed', 45.0],
      ['Failed', 26.8],
      ['Blocked', 12.8],
    ['Not Run', 8.5]
      ]);
   */
   // Set chart options
   var options = {'title':'Overall Test Progress',
      'width':420,
      'height':310};

   // Instantiate and draw the chart.
   var chart = new google.visualization.PieChart(document.getElementById('container1'));
   chart.draw(data, options);
}
google.charts.setOnLoadCallback(drawChart);
</script>
{/literal}

答案 3 :(得分:0)

用于 Xcode 10 +,Swift 4.2

的简单干净的解决方案

只需为地图的边距设置边缘插图

self.mapView.layoutMargins = UIEdgeInsets(top: 8, right: 8, bottom: 8, left: 8)
self.mapView.showAnnotations(map.annotations, animated: true)

请告诉我们它是否适合您。