Reposition legal label ( MKAttributionLabel )

爷,独闯天下 提交于 2019-12-22 02:00:42

问题


I'd want to move the Legal label to the right side. On iOS 6 and 7 the below solution was working fine, however on iOS 8.3 it seems to not work.

I get the label, then with a timer (0.1 sec) in viewDidLayoutSubviews I call this method :

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

which works nicely for rotation, etc. But as soon as I scroll the map, the label jumps back to the left. Tried to call this method in the regionDidChangeAnimated but the label jumps back first to the left then to right, it's really annoying...

How could I force that stupid label to stay on the right side ?

Solution as suggested by Christian :

  1. Subclass the MKMapView
  2. Move the moveLegalLabel code there
  3. Call it in layoutSubviews

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


回答1:


Hooks like -viewDidAppear:, -mapView:regionWillChangeAnimated: or -mapView:regionDidChangeAnimated:, like others suggested, are not suited for this purpose.

You best bet would be to subclass MKMapView and layout your label in -layoutSubviews after calling super.




回答2:


You need it to be in viewDidAppear and both of the MKMapViewDelegate methods. If you don't put it in both delegate methods you will get the jumping that you saw. That's all!

-(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:


A Swift 4 example:

  • Working on iOS 11

  • No need for sub-classes

(based off of Erik's answer)

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



回答4:


Try to use transform this way:

- (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));
}

If not works try to use 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:


You must load your code in viewDidAppear, before it your code may not take place. Apparently your code was being compiled before the views were ready.

-(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];
}

If you create a button and put your code in its action, when you click you can see the label moving.




回答6:


Here I moved it from the bottom to the top:

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
}



回答7:


For solution this problem you can:

1.Create Subclass (MKMapView)

class CustomMapView: MKMapView {

}

2.Override layouSubviews like this:

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

This way works for me



来源:https://stackoverflow.com/questions/30735770/reposition-legal-label-mkattributionlabel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!