2015-06-09 6 views
11

Ich möchte das Legal-Label auf die rechte Seite verschieben. Auf iOS 6 und 7 funktionierte die folgende Lösung gut, auf iOS 8.3 scheint sie jedoch nicht zu funktionieren.Rechtliche Kennzeichnung repositionieren (MKAttributionLabel)

ich das Etikett, dann mit einem Timer (0,1 sec) in viewDidLayoutSubviews nenne ich diese Methode:

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

, die schön für die Rotation funktioniert usw. Aber sobald ich die Karte scrollen, die Etikett springt zurück nach links. versuchten diese Methode in den regionDidChangeAnimated zu nennen, aber das Label springt zuerst, dann nach links nach rechts, es ist wirklich ärgerlich ...

Wie kann ich so dumm Label zwingen, auf der rechten Seite zu bleiben?

Lösung wie von Christian vorgeschlagen:

  1. Subclass die MKMapView
  2. Bewegen Sie den Code moveLegalLabel dort
  3. Nennen Sie es in layoutSubviews

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

+1

Warum in aller Welt würden Sie tun, dass mit einer 0,1 Verzögerung? –

+0

@ChristianSchnorr Weil ich das Etikett auf der rechten Seite auch nach der Drehung beibehalten muss. Das Hauptproblem sind die Karten-Neupositionierungen, die nach jeder Regionswechselbeschriftung ... – Templar

+0

Dann wie wäre es, wenn Sie sich nach der Rotation einhaken (aber ohne Verzögerung!) Und alles rückgängig machen, was die Karte getan hat? –

Antwort

2

Hooks wie -viewDidAppear:, -mapView:regionWillChangeAnimated: oder -mapView:regionDidChangeAnimated:, wie andere vorgeschlagen, sind nicht dafür geeignet:

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

Wenn nicht funktioniert layer.transform zu verwenden versuchen:

8

Sie benötigen es in viewDidAppear und in beiden MKMapViewDelegate-Methoden. Wenn Sie es nicht in beide Delegate-Methoden einfügen, erhalten Sie den Sprung, den Sie gesehen haben. Das ist alles!

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

Es ist etwas besser, aber es springt immer noch nach dem Zufallsprinzip ... Mit 'regionWillChangeAnimated' umgesetzt, in der Tat, das Label bleibt auf der rechten Seite ** während ** Ich die Karte verschieben, was ist nett. Aber danach in 'regionDidChangeAnimated' funktioniert manchmal, manchmal springt zufällig zurück ... – Templar

+0

Hmmm im Testen auf iOS 8 auf Simulator und es funktioniert gut. Stellen Sie das Label anderswo neu auf? – Erik

+0

Nein ... ich habe es sogar in 'viewDidLoad' kommentiert. Welchen Simulator hast du? 8.3? – Templar

1

Sie müssen Ihren Code in ViewDidAppear laden, bevor Ihr Code nicht stattfinden kann. Anscheinend wurde Ihr Code kompiliert, bevor die Ansichten fertig waren.

Wenn Sie eine Schaltfläche erstellen und den Code in die Aktion einfügen, können Sie nach dem Klicken die Beschriftung verschieben.

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

Try transform auf diese Weise zu verwenden, Zweck.

Sie beste Wette wäre MKMapView Unterklasse und Layout Ihres Etiketts in -layoutSubviewsnachsuper aufrufen.

+0

funktioniert überhaupt nicht. – Templar

0

Hier zog ich es von unten nach oben:

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 
}