Перемещение юридического ярлыка (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];
}
Ответы
Ответ 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
}