菜鸟教程小白 发表于 2022-12-12 16:00:11

ios - 如何在缩放 MKMapView 时显示 map 比例,如 Apple 的 Maps.app


                                            <p><p>我在我的自定义应用程序中使用 MKMapView,并希望像 Apple 的 Maps.app 一样在缩放期间显示 map 比例(卷尺)。这可能吗?</p>

<p>如果不是,我会实现自己的 map 比例,如何在 MKMapView 的缩放发生变化时获得持续更新信息? </p>

<pre><code>- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
</code></pre>

<p>似乎只在缩放开始时被调用一次,而</p>

<pre><code>- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
</code></pre>

<p> 在缩放结束时只调用一次。 </p>

<p>Maps.appmap 比例在缩放过程中不断实时显示和更新。</p>

<p>提前致谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我遇到了类似的问题,根据用户缩放获取 camera.altitude 以显示在标签中。</p>

<p>由于没有诸如“regionISChangeingAnimated”之类的方法,而只有WillChange和DidChange,所以我在WillChange处启动了一个计时器,并在DidChange处使其无效。计时器调用一个方法 (updateElevationLabel) 来计算相机在 map 上方的高度。 </p>

<p>但是,由于在调用 regionDidChange 之前不会计算 camera.altitude,因此请使用缩放比例和 map 的起始高度(缩放比例 = 1.0 并不总是等于高度 = 0m,这取决于您在世界的哪个位置)计算当前高度。在下面的方法中,起始高度是一个 float ,在加载时设置一次,并针对每个区域更改。 </p>

<p>最后,您可以更改高度的格式,例如从 km 从 m 超出某个高度(10'000 米以下)。 </p>

<p>对于老式:1m = 3.2808399 英尺。</p>

<pre><code>-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated {

    if (showsElevation) {

    //update starting height for the region
    MKMapCamera *camera = map.camera;
    CLLocationDistance altitude = camera.altitude;
    MKZoomScale currentZoomScale = map.bounds.size.width / map.visibleMapRect.size.width;
    float factor = 1.0/currentZoomScale;
    startingHeight = altitude/factor;

    elevationTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                      target:self
                                                    selector:@selector(updateElevationLabel)
                                                    userInfo:Nil
                                                   repeats:YES];
    ;

    }
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {

    ;
}


-(void)updateElevationLabel {


//1. create the label
if (!elevationLabel) {
    elevationLabel = ;
    ;
    ];
    ;
}

//2. grab the initial starting height (further updated on region changes)
if (startingHeight == 0) {
    MKMapCamera *camera = map.camera;
    CLLocationDistance altitude = camera.altitude;
    MKZoomScale currentZoomScale = map.bounds.size.width / map.visibleMapRect.size.width;
    float factor = 1.0/currentZoomScale;
    startingHeight = altitude/factor;
}

//3. get current zoom scale and altitude, format changes
MKZoomScale currentZoomScale = map.bounds.size.width / map.visibleMapRect.size.width;
float altitude = startingHeight * (1/currentZoomScale);
if (altitude&gt;10000) {
    altitude = altitude/1000;
      ];
} else {
      ];
}



}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在缩放 MKMapView 时显示 map 比例,如 Apple 的 Maps.app,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19572377/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19572377/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在缩放 MKMapView 时显示 map 比例,如 Apple 的 Maps.app