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

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

Другие вопросы по тегам