MGLMapView scaleBar положение внизу путем обновления ограничений
По умолчанию MGLMapView
ставит scaleBar
посмотреть в левом верхнем углу карты. Я хотел бы переместить его внизу слева, но у меня возникли проблемы с этим. Либо мой NSLayoutConstraint
код неправильный, или что-то еще происходит. scaleBar
все еще застрял в левом верхнем углу.
Вот что я попробовал:
NSMutableArray *scaleBarConstraints = [[NSMutableArray alloc] init];
[self.mapboxMapView removeConstraints:self.mapboxMapView.scaleBar.constraints];
[scaleBarConstraints addObject:
[NSLayoutConstraint constraintWithItem:self.mapboxMapView.scaleBar
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:self.mapboxMapView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:8.0 + self.mapboxMapView.contentInset.bottom]];
[scaleBarConstraints addObject:
[NSLayoutConstraint constraintWithItem:self.mapboxMapView.scaleBar
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.mapboxMapView
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:8.0 + self.mapboxMapView.contentInset.left]];
[self.mapboxMapView addConstraints:scaleBarConstraints];
Есть ли другой способ сделать это или я что-то пропустил?
1 ответ
Прежде всего, ваше первое ограничение определяет NSLayoutRelationGreaterThanOrEqual
отношение, так что это означает, что ваш scaleBar
Нижний край должен быть где-то выше нижнего края вида карты (+ указанная вами константа).
Это очевидно верно, когда масштабная линейка расположена в верхней части вида карты. Так что попробуй заменить NSLayoutRelationGreaterThanOrEqual
с NSLayoutRelationEqual
и посмотрим, поможет ли это.
Предупреждение 1:
Вы добавляете ограничения в self.mapboxMapView
что не является прямым наблюдением scaleBar
, (В библиотеке Mapbox они добавляют ограничения к containerView
.) Это плохая практика. Я рекомендую использовать
[NSLayoutConstraint activateConstraints:scaleBarConstraints];
вместо этого, который автоматически добавит ограничения к адекватному виду. (Apple рекомендует это в своей документации.)
Предупреждение 2:
Как правило, вы не должны взламывать иерархию представлений другого класса (который вам не принадлежит). Вы не можете предполагать, что в какой-то момент времени он не создает новых ограничений, которые могут переопределить или вступить в конфликт с вашими собственными ограничениями.
Чтобы изменить положение scaleBar, вы можете изменить, используя scaleBarPosition
недвижимость на определенном месте, можно дополнительно использовать scaleBarMargins
свойство для полей, например:
scaleBarMargins = CGPoint(x: scaleBar.frame.origin.x + 'offsetX', y: scaleBar.frame.origin.y + 'offsetY')
Надеюсь, это поможет!