Dera同事,
我很难用原生MKMapView实现可见区域。 我需要具有与Google Map SDK Visible Region完全相同的功能。
基本上它意味着在底部有一种填充代码:
let span = MKCoordinateSpan(latitudeDelta: 0.8, longitudeDelta: 0.8)
let reg = MKCoordinateRegion(center: someMyCoordinate, span: span)
mapView.setRegion(reg, animated: true)
它必须是这样的:一旦我在UIView坐标中添加了一些填充,它应该移动地图中心并调整缩放以使坐标区域完全可见,同时考虑填充。
可能我的描述有点乱,但是如果你看一下this video就会变得非常清楚。
提前谢谢!
答案 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];