iOS-MKMapView showAnnotations:动画:带填充?

iOS-MKMapView showAnnotations:动画:带填充?,ios,objective-c,cocoa-touch,mkmapview,Ios,Objective C,Cocoa Touch,Mkmapview,我希望能够缩放MKMapView以适应其注释。我已经使用iOS7的showAnnotations方法成功地做到了这一点。但我还想从地图视图边框添加一些填充或插入。这是因为我有一个覆盖地图顶部的半透明视图,我不希望注释位于该视图后面。我试过这个: [self.mapView showAnnotations:annotations animated:YES]; [self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePaddin

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

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

但它没有像我希望的那样起作用。有没有关于我如何做得不同的想法

你做得对。 试着换一下填充物,你会看到不同的

另一方面,您的代码中必须有其他内容阻止更改视图

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

创建一个实例变量

BOOL _mapNeedsPadding;
并将其初始化为NO

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

然后将此添加到您的类中

- (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];
    }
}
最后按如下方式调用showAnnotations函数:

_mapNeedsPadding = YES;
[self.mapView showAnnotations:annotations animated:YES];
showAnnimation将触发regionDidChangeAnimated功能。 更改visibleMapRect后需要将_mapNeedsPadding设置为否,因为此函数(setVisibleMapRect:self)也将触发RegiondChangeAnimated


希望这有帮助

您也可以简单地使用

[self.mapView showAnnotations:annotations animated:YES];
self.mapView.camera.altitude *= 1.4;
缩小一点。
对我来说效果很好。

从iOS8开始,
MKMapView
有一个
layoutMargin
属性。设置此选项后,
centerRegion:
showAnnotations:
以及尝试在地图视图中拟合矩形的所有方法将考虑上述布局边距

如果半透明视图的高度为40点,并附着到地图视图的顶部,则设置
mapView.layoutMargin=uiedgeInSectMake(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()
    }
}
另一个解决方案:

extension MKMapView
{
    func fitAllMarkers(inset: UIEdgeInsets? = nil) {
        self.showAnnotations(self.annotations, animated: false)
        OperationQueue.main.addOperation {
            self.setVisibleMapRect(self.visibleMapRect, edgePadding: inset ?? UIEdgeInsets.zero, animated: true)
        }
    }
}

回答得好!在mapView上调用setVisibleMapRect:之前,您可能需要设置_mapNeedsPadding=NO。否则,它会导致一个递归循环,这将导致一个错误的访问错误(我已经编辑了答案以反映相同的结果。如果您不同意此编辑,请告诉我)即使在将近一年后对我仍然有效:)工作正常,但一旦我更改了高度,注释不再是中心我到处寻找这个
layoutMargin
,放弃后,我尝试自己实现它。多亏了你,它现在可以正常工作了。它肯定是在检查课程,因为它需要与此相同才能被MapView接受。这还将移动地图左下方的Apple Maps“Legal”按钮,对于meI来说,这不是一个好的解决方案,但当我试图将视图约束到底部锚点时,它崩溃了,我不认为锚点应该像那些吸气剂中的锚点一样。除了铝的响应-如果你旋转地图视图,使北面不直接朝上,这也会缩进地图显示的圆形指南针图标以指示航向。