Как вы перемещаете юридический знак в mapview

Интересно, знает ли кто-нибудь, как вы перемещаете юридический знак на карте, прямо сейчас моя панель инструментов покрывает его. Кто-нибудь знает как? Существует много помощи с логотипом google, но на картах Apple ничего нет.

Legal sign in bottom left corner

Ответ 1

Это должно работать, хотя я не уверен, разрешит ли Apple вам это сделать

UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.center = CGPointMake(attributionLabel.center.x, attributionLabel.center.y - 44.0f);

Ответ 2

В Swift:

mapView.layoutMargins = UIEdgeInsetsMake(top, right, -20, left)

Я тестировал это в OS9, и он работает.

Ответ 3

Это все еще возможно в iOS 7, но только (?), если оно помещено в viewDidAppear. Коорды reset, если они помещены в viewDidLoad или viewWillAppear.

    UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
    attributionLabel.center = CGPointMake(attributionLabel.center.x, attributionLabel.center.y - 44.0f);

Ответ 4

Эти методы больше не работают на iOS 7. Правильный способ - указать bottomLayoutGuide на вашем UIViewController. Подробно описано здесь

Ответ 5

Изменение положения не совсем работает, однако скрытие кнопки "Правовая" работает отлично.

[[mapView.subviews objectAtIndex: 1] setHidden: YES]

EDIT:

Swift 2.0 iOS-эквивалент

mapView.subviews [1].isHidden = true

Ответ 6

Выполнение пункта 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

Ответ 7

Пример 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
}

Ответ 8

@Ответ на 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)
    }
}

Ответ 9

Я написал расширение, которое сработало для меня. Он может использоваться в анимационном блоке для анимации этих изменений:

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

Ответ 10

Используйте 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)
}