Интересно, знает ли кто-нибудь, как вы перемещаете юридический знак на карте, прямо сейчас моя панель инструментов покрывает его. Кто-нибудь знает как? Существует много помощи с логотипом google, но на картах Apple ничего нет.
Интересно, знает ли кто-нибудь, как вы перемещаете юридический знак на карте, прямо сейчас моя панель инструментов покрывает его. Кто-нибудь знает как? Существует много помощи с логотипом google, но на картах Apple ничего нет.
Это должно работать, хотя я не уверен, разрешит ли Apple вам это сделать
UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.center = CGPointMake(attributionLabel.center.x, attributionLabel.center.y - 44.0f);
В Swift:
mapView.layoutMargins = UIEdgeInsetsMake(top, right, -20, left)
Я тестировал это в OS9, и он работает.
Это все еще возможно в iOS 7, но только (?), если оно помещено в viewDidAppear
.
Коорды reset, если они помещены в viewDidLoad
или viewWillAppear
.
UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.center = CGPointMake(attributionLabel.center.x, attributionLabel.center.y - 44.0f);
Эти методы больше не работают на iOS 7. Правильный способ - указать bottomLayoutGuide на вашем UIViewController. Подробно описано здесь
Изменение положения не совсем работает, однако скрытие кнопки "Правовая" работает отлично.
[[mapView.subviews objectAtIndex: 1] setHidden: YES]
EDIT:
Swift 2.0 iOS-эквивалент
mapView.subviews [1].isHidden = true
Выполнение пункта Skeet Skeet.
Я реализовал ваш подход, который сработал хорошо, но после многократного появления в viewcontroller юридический ярлык y продолжает уменьшаться, поскольку вы видите, что логика всегда смещается. поэтому вместо изменения центра я предлагаю
мы меняем рамку
UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.frame = CGRectMake(20, self.view.frame.size.height - 135, attributionLabel.frame.size.width, attributionLabel.frame.size.height);
\\135 is height of your bottom view that was hiding legal
Пример Swift 3, основанный на примере @xeieshan, который работает при компиляции с IOS 10 SDK. В моем примере у меня есть прозрачная панель внизу, которая анимируется, когда присутствует представление карты. Перемещение метки также может быть анимировано.
// reposition the 'Legal' label above the transparent bottom bar
// unfortunately there is no safe way to identify the label but it is the last subview - hopefully this will not change 😱
if let legalLabel = mapView.subviews.last {
var frame = legalLabel.frame
frame.origin.y = frame.origin.y - self.bottomBar.bounds.size.height // reposition it above the bottom bar
legalLabel.frame = frame
}
@Ответ на Dymtro хорошо работает для меня, но я бы предложил сначала проверить размер подзаголовков. Это должно по крайней мере предотвратить возможные сбои, если иерархия представлений изменится в будущем:
override func viewWillLayoutSubviews() {
positionLegalMapLabel()
}
func positionLegalMapLabel() {
if self.mapView.subviews.count > 1 {
let legalMapLabel = self.mapView.subviews[1]
legalMapLabel.frame.origin = CGPointMake(self.mapView.bounds.size.width - legalMapLabel.frame.size.width - 7, legalMapLabel.frame.origin.y)
}
}
Я написал расширение, которое сработало для меня. Он может использоваться в анимационном блоке для анимации этих изменений:
import MapKit
extension MKMapView {
/// Workaround for layoutMargins bug.
func setLegalInsets(left: CGFloat, bottom: CGFloat) {
let oldLeft = layoutMargins.left
let oldBottom = layoutMargins.bottom
let lblLegal = (subviews.filter { view in
return view is UILabel
}).first
lblLegal?.frame.origin.x += left - oldLeft
lblLegal?.frame.origin.y -= bottom - oldBottom
layoutMargins.left = left
layoutMargins.bottom = bottom
}
}
Используйте viewWillLayoutSubviews() вместо viewDidAppear(), чтобы избежать перехода.
override func viewWillLayoutSubviews() {
positionLegalMapLabel()
}
func positionLegalMapLabel() {
let legalMapLabel = self.mapView.subviews[1]
legalMapLabel.frame.origin = CGPointMake(self.mapView.bounds.size.width - legalMapLabel.frame.size.width - 7, legalMapLabel.frame.origin.y)
}