2015-06-09 10 views
11

Vorrei spostare l'etichetta Legale sul lato destro. Su iOS 6 e 7 la soluzione sotto funzionava bene, tuttavia su iOS 8.3 sembra non funzionare.Riposizionare l'etichetta legale (MKAttributionLabel)

ottengo l'etichetta, poi con un timer (0,1 sec) in viewDidLayoutSubviews Io chiamo questo metodo:

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

che funziona bene per la rotazione, ecc Ma appena ho scorrere la mappa, la l'etichetta salta indietro a sinistra. Ho provato a chiamare questo metodo nello regionDidChangeAnimated ma l'etichetta salta indietro prima a sinistra e poi a destra, è davvero fastidioso ...

Come potrei costringere quella stupida etichetta a rimanere sul lato destro?

soluzione come suggerito da Christian:

  1. sottoclasse il MKMapView
  2. spostare il codice moveLegalLabel ci
  3. chiamano in layoutSubviews

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

+1

Perché mai l'hai fatto con un ritardo di 0,1? –

+0

@ChristianSchnorr Perché devo conservare l'etichetta a destra anche dopo la rotazione. Il problema principale sono le riposizionazioni delle mappe che etichettano dopo ogni cambiamento di regione ... – Templar

+0

Allora, che ne dici di entrare dopo la rotazione (ma senza un ritardo!) E annullare qualsiasi cosa la mappa abbia fatto? –

risposta

2

Ganci come -viewDidAppear:, -mapView:regionWillChangeAnimated: o -mapView:regionDidChangeAnimated:, come altri hanno suggerito, non sono adatti per questo scopo.

È migliore da fare sarebbe quella di sottoclasse MKMapView e il layout dell'etichetta in -layoutSubviewsdopo chiamare super.

8

È necessario che sia in viewDidAppear e in entrambi i metodi MKMapViewDelegate. Se non lo inserisci in entrambi i metodi delegati, otterrai il salto che hai visto. È tutto!

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

È un po 'meglio, ma salta comunque a caso ... Con 'regionWillChangeAnimated' implementato, infatti, l'etichetta rimane sul lato destro ** mentre ** Sposto la mappa, che è simpatico. Ma dopo che in soemstories 'regionDidChangeAnimated' funziona, a volte salta in modo casuale indietro ... – Templar

+0

Hmmm im testing su iOS 8 sul simulatore e funziona bene. Stai riposizionando l'etichetta altrove? – Erik

+0

No ... Ho commentato anche in 'viewDidLoad'. Che simulatore hai? 8.3? – Templar

1

è necessario caricare il codice in viewDidAppear, prima che il codice non può aver luogo. Apparentemente il tuo codice veniva compilato prima che le viste fossero pronte.

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

Se si crea un pulsante e si inserisce il codice nella sua azione, quando si fa clic si può vedere l'etichetta in movimento.

1

Tenta di utilizzare transform questo modo:

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

Se non lavori cercano di usare 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)); 
} 
+0

Non funziona affatto. – Templar

0

Qui ho spostato dal basso verso l'alto:

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 
}