IOS - MKMapView showAnnotations: анимированный: с заполнением?

Я хочу, чтобы иметь возможность масштабировать мой MKMapView, чтобы соответствовать его аннотации. Мне удалось это сделать с помощью метода iOS7 showAnnotations. Но я также хотел бы добавить некоторые дополнения или вставки с границы карты. Это связано с тем, что у меня есть полупрозрачный вид, который накладывает верхнюю часть моей карты, и я не хочу, чтобы аннотации были местами за этим видом. Я пробовал это:

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

Но он не работает, как я бы надеялся. Любые идеи о том, как я могу сделать это по-другому?

Ответ 1

Вы делаете это правильно. Попробуйте изменить прописку, вы увидите разницу.

Другим способом, в вашем коде должно быть что-то еще, что предотвращает изменение вида

EDIT: Я был совершенно неправ. Попробуйте следующее:

Создать переменную экземпляра

BOOL _mapNeedsPadding;

и инициализировать его до NO;

Затем установите делегат mapView в себя и добавьте его в заголовок класса

Затем добавьте это в свой класс

- (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. Вам нужно установить _mapNeedsPadding в NO после изменения visibleMapRect, потому что эта функция (setVisibleMapRect: self) также запускает regionDidChangeAnimated.

Надеюсь, это поможет!

Ответ 2

Вы также можете просто использовать

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

чтобы уменьшить масштаб. Хорошо работает для меня.

Ответ 3

Начиная с 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()
    }
}