Подтвердить что ты не робот

Перемещение юридического ярлыка (MKAttributionLabel)

Я хочу переместить ярлык Legal вправо. На iOS 6 и 7 решение ниже работало нормально, однако на iOS 8.3 оно, похоже, не работает.

Я получаю метку, затем с таймером (0,1 с) в viewDidLayoutSubviews Я вызываю этот метод:

-(void)moveLegalLabel
{
    UIView * legalLink = [self attributionView];
    legalLink.frame = CGRectMake(self.mapView.frame.size.width - legalLink.frame.size.width - 10, self.mapView.frame.size.height - legalLink.frame.size.height - 10 , legalLink.frame.size.width, legalLink.frame.size.height);
    legalLink.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
}

который отлично работает для вращения и т.д. Но как только я прокручу карту, метка вернется влево. Попробовал вызвать этот метод в regionDidChangeAnimated, но метка вернется сначала влево, затем вправо, это действительно раздражает...

Как я могу заставить эту глупую ярлык остаться с правой стороны?

Решение, предложенное Кристианом:

  • Подкласс MKMapView
  • Переместите код moveLegalLabel там
  • Назовите его layoutSubviews

-(void)layoutSubviews { [super layoutSubviews]; [self moveLegalLabel]; }

4b9b3361

Ответ 1

Крюки типа -viewDidAppear:, -mapView:regionWillChangeAnimated: или -mapView:regionDidChangeAnimated:, как и другие предложенные, не подходят для этой цели.

Лучше всего поставить подкласс MKMapView и расставить ярлык в -layoutSubviews после вызова super.

Ответ 2

Вам нужно, чтобы он находился в viewDidAppear и оба метода MKMapViewDelegate. Если вы не поместите его в оба метода делегата, вы получите прыжок, который вы видели. Все это!

-(void)viewDidAppear:(BOOL)animated
{
    [self moveLegalLabel];
}

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    [self moveLegalLabel];
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    [self moveLegalLabel];
}

-(void)moveLegalLabel
{
    UIView * legalLink = [self.map.subviews objectAtIndex:1];
    legalLink.frame = CGRectMake(self.map.frame.size.width - legalLink.frame.size.width - 10, self.map.frame.size.height - legalLink.frame.size.height - 10 , legalLink.frame.size.width, legalLink.frame.size.height);
    legalLink.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
}

Ответ 3

Вы должны загрузить свой код в viewDidAppear, прежде чем ваш код может не состояться. По-видимому, ваш код компилировался до того, как представления были готовы.

-(void)moveLegalLabel
{
    UIView * legalLink = _mapView.subviews[1];
    legalLink.frame = CGRectMake(self.mapView.frame.size.width - legalLink.frame.size.width - 10, self.mapView.frame.size.height - legalLink.frame.size.height - 10 , legalLink.frame.size.width, legalLink.frame.size.height);
    legalLink.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
}


-(void)viewDidAppear:(BOOL)animated {
    [self moveLegalLabel];
}

Если вы создаете кнопку и помещаете свой код в свое действие, при нажатии вы можете увидеть перемещение метки.

Ответ 4

Попробуйте использовать transform следующим образом:

- (void)moveLegalLabel
{
    UIView *legalLink = [self attributionView];
    legalLink.transform = CGTransformMakeTranslation(self.mapView.frame.size.width - CGRectGetMaxX(legalLink.frame) - CGRectGetMinX(legalLink.frame), self.mapView.frame.size.height - CGRectGetMaxY(legalLink.frame) - CGRectGetMinY(legalLink.frame));
}

Если не работает, попробуйте использовать layer.transform:

- (void)moveLegalLabel
{
    UIView *legalLink = [self attributionView];
    legalLink.layer.transform = CATransform3DMakeTranslation(self.mapView.frame.size.width - CGRectGetMaxX(legalLink.frame) - CGRectGetMinX(legalLink.frame), self.mapView.frame.size.height - CGRectGetMaxY(legalLink.frame) - CGRectGetMinY(legalLink.frame));
}

Ответ 5

Здесь я переместил его снизу вверх:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    // Move legal notice since covered in design
    mapView.subviews
        .first { "\(type(of: $0))" == "MKAttributionLabel" }?
        .frame.origin.y = mapView.frame.minY + 10
}