iOS - MKMapView showAnnotations:animated:with padding?

And*_*ers 11 cocoa-touch objective-c mkmapview ios

我希望能够缩放我的MKMapView以适应它的注释.我已经设法使用iOS7的showAnnotations方法.但我还想从地图视图边框添加一些填充或插入.这是因为我有一个半透明的视图覆盖了我的地图的顶部,我不希望注释成为这个视图背后的地方.我试过这个:

[self.mapView showAnnotations:annotations animated:YES];
[self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:NO];
Run Code Online (Sandbox Code Playgroud)

但它没有像我希望的那样工作.关于如何以不同方式做到这一点的任何想法?

小智 16

你也可以简单地使用

[self.mapView showAnnotations:annotations animated:YES];
self.mapView.camera.altitude *= 1.4;
Run Code Online (Sandbox Code Playgroud)

缩小一点.对我来说效果很好.

  • 即使在将近一年之后,也适合我:) (2认同)

tom*_*ahh 16

从iOS8开始,MKMapView有一个layoutMargin属性.当此设置,centerRegion:,showAnnotations:并试图以适应地图视图中的矩形区域的所有方法都考虑到上述的布局空间.

如果您半透明的看法是40点的高度和附加到地图视图的顶部,设置mapView.layoutMargin = UIEdgeInsetMake(40, 0, 0, 0)会做的魔力.

如果定位iOS7,地图视图使用它的包含控制器的顶部和底部的布局引导到也抵消其内容.因此,您可以覆盖topLayoutGuide控制器的方法以返回所需的长度.

class ViewController: UIViewController {
      override var topLayoutGuide: UILayoutSupport {
        return MapLayoutGuide(length: 40)
    }
}


class MapLayoutGuide: NSObject, UILayoutSupport {
    var length: CGFloat

    init(length: CGFloat) {
        self.length = length
        super.init()
    }

    @available(iOS 9.0, *)
    var bottomAnchor: NSLayoutYAxisAnchor {
        return NSLayoutYAxisAnchor()
    }
    @available(iOS 9.0, *)
    var topAnchor: NSLayoutYAxisAnchor {
        return NSLayoutYAxisAnchor()
    }
    @available(iOS 9.0, *)
    var heightAnchor: NSLayoutDimension {
        return NSLayoutDimension()
    }
}
Run Code Online (Sandbox Code Playgroud)


The*_*ker 12

你正在以正确的方式做到这一点.尝试更改填充,你会看到差异.

否则,代码中必须有其他内容阻止更改视图

编辑:我完全错了.试试这个:

创建一个实例变量

BOOL _mapNeedsPadding;
Run Code Online (Sandbox Code Playgroud)

并将其初始化为NO;

然后将mapView委托设置为self并将a添加到类标题中

然后将其添加到您的班级

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
    if(_mapNeedsPadding){
        _mapNeedsPadding = NO;
        [self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES];
    }
}
Run Code Online (Sandbox Code Playgroud)

最后像这样调用showAnnotations函数:

_mapNeedsPadding = YES;
[self.mapView showAnnotations:annotations animated:YES];
Run Code Online (Sandbox Code Playgroud)

showAnnimation将触发regionDidChangeAnimated函数.更改visibleMapRect后需要将_mapNeedsPadding设置为NO,因为此函数(setVisibleMapRect:self)也将触发regionDidChangeAnimated.

希望这可以帮助 !