重新定位法律标签(MKAttributionLabel)

Tem*_*lar 14 iphone mapkit mkmapview ios ios8

我想将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;
}
Run Code Online (Sandbox Code Playgroud)

它可以很好地用于旋转等.但是一旦我滚动地图,标签就会跳回到左边.试图在这个方法中调用这个方法,regionDidChangeAnimated但是标签首先向左跳,然后向右跳,这真的很烦人......

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

Christian建议的解决方案:

  1. 子类MKMapView
  2. moveLegalLabel代码移到那里
  3. 打电话给 layoutSubviews

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

Eri*_*rik 8

您需要它在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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Swift 4 示例:

  • 在 iOS 11 上工作

  • 不需要子类

(基于埃里克的回答)

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)
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*orr 3

-viewDidAppear:像其他人建议的那样,像、-mapView:regionWillChangeAnimated:或 之类的钩子-mapView:regionDidChangeAnimated:不适合此目的。

您最好的选择是在调用MKMapView对标签进行子类化和布局。-layoutSubviews super