【问题标题】:iOS - MKMapView showAnnotations:animated: with padding?iOS - MKMapView showAnnotations:animated: with padding?
【发布时间】:2014-02-20 15:33:03
【问题描述】:

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

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

但它并没有像我希望的那样工作。关于我如何以不同的方式做的任何想法?

【问题讨论】:

    标签: ios objective-c cocoa-touch mkmapview


    【解决方案1】:

    你也可以简单地使用

    [self.mapView showAnnotations:annotations animated:YES];
    self.mapView.camera.altitude *= 1.4;
    

    缩小一点。 很适合我。

    【讨论】:

    • 即使在将近一年后仍然对我有用 :)
    • 工作正常,但是一旦我改变高度,注释不再居中
    【解决方案2】:

    从 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()
        }
    }
    

    【讨论】:

    • 我到处都在寻找这个layoutMargin,在放弃之后,尝试自己实现它。多亏了你,它现在可以正常工作了
    • 它肯定是在检查类,因为它需要与此相同才能被 mapView 接受
    • 这也会移动地图左下角的Apple Maps“法律”按钮,对我来说不是一个好的解决方案
    • 我正在使用它,但是当我试图将视图约束到底部锚点时它崩溃了,我不认为锚点应该像它们在那些 getter 中那样初始化。
    • 除了 Aluminium 的响应 - 如果您旋转地图视图的视图以使北不直接朝上,这也会使地图上显示的圆形罗盘图标缩进以指示航向。
    【解决方案3】:

    你做对了。 尝试更改填充,您会看到不同。

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

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

    创建实例变量

    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];
    

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

    希望这会有所帮助!

    【讨论】:

    • 很好的答案!您可能希望在您的 mapView 上调用 setVisibleMapRect: 之前设置 _mapNeedsPadding = NO。否则会导致递归循环,从而导致错误的访问错误(我已编辑答案以反映相同。如果您不同意此编辑,请告诉我)
    【解决方案4】:

    另一种解决方案:

    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)
            }
        }
    }
    

    【讨论】:

    • 这不是从初始视图到最终视图的动画,所以不适合我。
    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2013-12-09
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多