MKMapView可见区域填充

时间:2014-12-10 08:43:30

标签: ios swift mkmapview google-maps-sdk-ios

Dera同事,

我很难用原生MKMapView实现可见区域。 我需要具有与Google Map SDK Visible Region完全相同的功能。

enter image description here

基本上它意味着在底部有一种填充代码:

let span = MKCoordinateSpan(latitudeDelta: 0.8, longitudeDelta: 0.8)
let reg = MKCoordinateRegion(center: someMyCoordinate, span: span)
mapView.setRegion(reg, animated: true)

它必须是这样的:一旦我在UIView坐标中添加了一些填充,它应该移动地图中心并调整缩放以使坐标区域完全可见,同时考虑填充。

可能我的描述有点乱,但是如果你看一下this video就会变得非常清楚。

提前谢谢!

5 个答案:

答案 0 :(得分:10)

感谢上面提出的方法,完整的解决方案如下。

import Foundation
import MapKit
extension MKCoordinateRegion{
    var mapRect:MKMapRect {
        get{
            let a = MKMapPointForCoordinate(CLLocationCoordinate2DMake(
                   self.center.latitude + self.span.latitudeDelta / 2,
                   self.center.longitude - self.span.longitudeDelta / 2))

            let b = MKMapPointForCoordinate(CLLocationCoordinate2DMake(
                    self.center.latitude - self.span.latitudeDelta / 2,
                    self.center.longitude + self.span.longitudeDelta / 2))

            return MKMapRectMake(min(a.x,b.x), min(a.y,b.y), abs(a.x-b.x), abs(a.y-b.y))
        }
    }
}

extension MKMapView {
    func setVisibleRegion(mapRegion: MKCoordinateRegion, edgePadding insets: UIEdgeInsets, animated animate: Bool) {
        self.setVisibleMapRect(mapRegion.mapRect, edgePadding: insets , animated: animate)
    }
}

现在你可以使用 setVisibleRegion func。

答案 1 :(得分:6)

如果您打印可见区域,您将看到跨度将被填充,因为它需要适合视图。 中心坐标仍将位于视图的中心。 我不确定你想做什么,但我想它可以用

存档
setVisibleMapRect:edgePadding:animated:

您需要将区域转换为MKMapRect。见Convert MKCoordinateRegion to MKMapRect 如何做到这一点

答案 2 :(得分:1)

如果您需要快速从100的底部开始填充,则可以简单地写:

mapView.layoutMargins = UIEdgeInsets(top: 10, right: 10, bottom: 100, left: 10)

然后您可以检查地图是否以某些注释为中心,例如:

mapView.showAnnotations(mapView.annotations, animated: true)

答案 3 :(得分:0)

使用Google填充的原因是为了避免使用Google按钮和版权,因此您可以在地图边缘提供自己的用户界面。 (如Google Maps Video中所示)

从iOS 11开始,Apple不仅解决了填充问题,而且还为您提供了放置新类的控件的位置,从而解决了相同的问题。那些是

MKScaleView
MKCompassButton
MKUserTrackingButton

将它们放置在地图上的任何地方,甚至在地图之外。 它们与MKMapView完全集成。

Apple唯一忘记的控件是左下角的合法链接(至少对于ltr语言而言)。因此,至少在iOS 11中,此链接始终是我们设计的方式。

也许您真的想要填充,然后选择其他答案。 但是,如果您想控制放置Apple控件,并且负担不起不支持iOS 11之前的iOS版本,请使用新类。

答案 4 :(得分:-1)

你需要一些逻辑坐标设置如下并设置区域,然后你可以设置与谷歌地图相同的缩放级别。

MKCoordinateRegion region;

CLLocationDegrees maxLat = -90;
CLLocationDegrees maxLon = -180;
CLLocationDegrees minLat = 90;
CLLocationDegrees minLon = 180;

float currentLatitude;

float currentLongitude;

if(currentLatitude> maxLat)

maxLat = currentLatitude;

if(currentLatitude< minLat)

minLat = currentLatitude;

if(currentLongitude> maxLon)

maxLon = currentLongitude;

if(currentLongitude< minLon)

minLon = currentLongitude;

region.center.latitude =(maxLat + minLat)/ 2;

region.center.longitude =(maxLon + minLon)/ 2;

region.span.latitudeDelta = maxLat - minLat;

region.span.longitudeDelta = maxLon - minLon;

[myMapview setRegion:region animated:YES];

[myMapview setCenterCoordinate:theCoordinate zoomLevel:13 animated:YES];