重新定位合法标签 ( MKAttributionLabel )

Reposition legal label ( MKAttributionLabel )

我想将法律标签移到右侧。在 iOS 6 和 7 上,下面的解决方案工作正常,但是在 iOS 8.3 上它似乎不起作用。

我得到标签,然后在 viewDidLayoutSubviews 中使用计时器(0.1 秒)我调用此方法:

-(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中调用这个方法,但是标签先左跳右跳,真烦人...

我怎么能强迫那个愚蠢的标签留在右边呢?

Christian 建议的解决方案:

  1. 子类化 MKMapView
  2. moveLegalLabel 代码移到那里
  3. layoutSubviews
  4. 中调用

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

您需要它在 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;
}

您必须在 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];
}

如果您创建一个按钮并将代码放入其操作中,当您单击时,您可以看到标签移动。

尝试这样使用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));
}

-viewDidAppear:-mapView:regionWillChangeAnimated:-mapView:regionDidChangeAnimated: 这样的挂钩,就像其他人建议的那样,不适合这个目的。

您最好的选择是子类化 MKMapView 并在 -layoutSubviews after 调用 super.

中布置您的标签

这里我把它从底部移到了顶部:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

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

要解决此问题,您可以:

1.Create 子类 (MKMapView)

class CustomMapView: MKMapView {

}

2.Override 像这样的布局子视图:

override func layoutSubviews() {
        super.layoutSubviews()
        let legalLabel: UIView = self.subviews[1]
        let frame = .....
    }

这种方式适合我

一个Swift4 例子:

  • 正在处理 iOS 11

  • 不需要分类

(基于 Erik 的回答)

func viewDidAppear(_ animated: Bool) {
   moveLegalLabel()
}

func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
   moveLegalLabel()
}

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
   moveLegalLabel()
}

func moveLegalLabel() {
   let legalLabel: UIView = mapView.subviews[1]
   legalLabel.frame=CGRect(x: mapView.frame.size.width - (legalLabel.frame.size.width ?? 0.0) - 10, y: mapView.frame.size.height - (legalLabel.frame.size.height ?? 0.0) - 10, width: legalLabel.frame.size.width ?? 0.0, height: legalLabel.frame.size.height ?? 0.0)
}