iOS - MKMapView showAnnotations:animated: with padding?

后端 未结 4 1973
春和景丽
春和景丽 2020-12-14 21:53

I want to be able to zoom my MKMapView to fit it\'s annotations. I have managed to do it using iOS7\'s showAnnotations method. But I would also like to add some

相关标签:
4条回答
  • 2020-12-14 22:25

    another solution:

    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)
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-14 22:37

    Starting with iOS8, MKMapView has a layoutMargin property. When this is set, centerRegion:, showAnnotations: and all methods that try to fit a rectangle within the map view will take into account the aforementioned layout margins.

    If your translucent view is 40 points height and attached to the top of the map view, settings mapView.layoutMargin = UIEdgeInsetMake(40, 0, 0, 0) will do the magic.

    If targeting iOS7, the map view uses the top and bottom layout guide of its containing controller to also offset its content. So you could override the topLayoutGuide method of the controller to return the desired length.

    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()
        }
    }
    
    0 讨论(0)
  • 2020-12-14 22:41

    You could also simply use

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

    to zoom out a little. Works well for me.

    0 讨论(0)
  • 2020-12-14 22:44

    You are doing it the right way. Try changing the padding, you'll see the difference.

    Other way, there must be something else in your code preventing from changing the view

    EDIT: I was totally wrong. Try this:

    Create an instance variable

    BOOL _mapNeedsPadding;
    

    and initialize it to NO;

    Then set your mapView delegate to self and add a to your class header

    Then add this to your class

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

    And finally call your showAnnotations function like this:

    _mapNeedsPadding = YES;
    [self.mapView showAnnotations:annotations animated:YES];
    

    The showAnnimation will trigger the regionDidChangeAnimated function. You need to set _mapNeedsPadding to NO after changing visibleMapRect because this function (setVisibleMapRect:self) will also trigger regionDidChangeAnimated.

    Hope this helps !

    0 讨论(0)
提交回复
热议问题