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