在MKMapView中设置当前位置图标的下方

时间:2014-07-01 11:26:49

标签: ios ios7 mkmapview ios6-maps

我想在地图中显示当前位置较低(iOS 6和iOS 7),如下面的屏幕截图用户可以看到更多视图[google默认应用程序与谷歌地图]。

enter image description here

现在,在视图中显示中心的光标如下图所示[我的app with apple map]。 enter image description here

因此,屏幕的最大部分用于显示背后的内容,但它无法向前看。

在第一张图片和第二张图片中,我将与Google导航进行比较,后者显示屏幕中当前位置低得多,旋转角度大致相同。我添加了一些箭头来显示我在说什么。

我尝试下面的设置中心代码,因为我找不到设置更低。

  

mapView.userTrackingMode = MKUserTrackingModeFollow;

并尝试以下方法

  

[mapView setCenterCoordinate:currentLocation.coordinate animated:YES];

3 个答案:

答案 0 :(得分:2)

请勿设置userTrackingMode或地图的centerCoordinate

相反,您可以尝试将MKMapCamera指向坐标稍微超前于用户的坐标。这将自动将用户的位置放在屏幕下方。

计算坐标“前方短距离”目前尚未内置到iOS SDK中,因此您必须手动计算它。

一种方法是使用以下方法:  Calculate new coordinate x meters and y degree away from one coordinate

使用该答案中的coordinateFromCoord:atDistanceKm:atBearingDegrees:方法,您可以像这样设置相机:

MKMapCamera *cam = [MKMapCamera camera];

CLLocationCoordinate2D coordinateAhead = 
    [self coordinateFromCoord:currentLocation.coordinate 
                 atDistanceKm:0.15 
             atBearingDegrees:currentLocation.course];
//adjust distance (0.15 km) as needed

cam.centerCoordinate = coordinateAhead;

cam.heading = currentLocation.course;

cam.pitch = 80; //adjust pitch as needed (0=look straight down)

cam.altitude = 100; //adjust as needed (meters)

[mapView setCamera:cam animated:YES];

在模拟器中使用“City Bicycle Ride”,“City Run”或“Freeway Drive”进行尝试。
您可能需要调整一些数字以获得所需的视角。

答案 1 :(得分:2)

layoutMargins上设置MKMapView很好。

根据文档

  

在视图中布局内容时要使用的默认间距。

     

在iOS 11及更高版本中,请使用directionalLayoutMargins属性   指定布局边距而不是此属性。

要将摄影机的中心点偏移到MKMapView的下半部分,只需将UIEdgeInsets.top设置为MKMapView's高度的一半即可。

class MapViewController: UIViewController {
@IBOutlet var mapView: MKMapView!

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let layoutMargins = UIEdgeInsets(top: self.mapView.bounds.size.height / 2, left: 0, bottom: 0, right: 0)
    self.mapView.layoutMargins = layoutMargins
}

答案 2 :(得分:0)

一个简单的解决方法应该是使MKMapView框架大于设备的屏幕。 类似的东西:

MapViewHeight = (WindowHeight - desiredOffsetFromBottom)*2