2015-06-01 13 views
10

Quando si anima la posizione della sottoclasse UITextField, il testo nel campo salta fuori dal passo con la posizione dello UITextField che lo trattiene, il che è molto stridente e non riesco a capire perché succede: before during during during endIl testo salta quando si anima la sottoclasse UITextField

mio sottoclasse aggiunge un pulsante alla destra del campo di testo che, quando sfruttato chiama un metodo sul controller della vista, che cambia il colore del campo di testo di confine e mossa s il campo di testo sullo schermo modificando il vincolo di spazio superiore del campo di testo e un paio di altre viste posizionate sopra di esso.

[UIView animateWithDuration:0.3 
        animations:^{ 
         self.tableViewBottomSpaceConstraint.constant = 0; 
         self.mainLabelHeightConstraint.constant = 0; 
         self.subLabelTopSpaceConstraint.constant = 0; 
         self.postCodeFieldTopSpaceConstraint.constant = 12; 
         [self.view layoutIfNeeded]; 

        }]; 
+0

stesso problema qui fratello .... sto anche affrontando lo stesso problema. nella mia classe personalizzata sto semplicemente dando un padding da sinistra al campo di testo. non l'ho ancora capito. –

+2

Possibile duplicato di [Testo in UITextField si sposta dopo la modifica (centro durante la modifica)] (http://stackoverflow.com/questions/9674566/text-in-uitextfield-moves-up-after-editing-center-while-editing) – Andy

risposta

9

Ho risolto questo problema. cambia il tuo codice a questo Funzionerà.

[UIView animateWithDuration:0.3 
       animations:^{ 
        self.tableViewBottomSpaceConstraint.constant = 0; 
        self.mainLabelHeightConstraint.constant = 0; 
        self.subLabelTopSpaceConstraint.constant = 0; 
        self.postCodeFieldTopSpaceConstraint.constant = 12; 
        [self.view layoutSubviews]; 

       }]; 

o se questo non funziona allora invece di

[self.view layoutSubviews]; 

utilizzare la vista padre del campo di testo e layoutSubviews. Nel mio caso questo ha funzionato. Penso che questa risposta sia idonea per la taglia. Grazie.

EDIT:

ho trovato il motivo di questo. Quando proviamo a layoutIfNeeded significa che prima cambia il layout esterno e dopo che cambia il suo layout cambia il testo interno di UITextField perché non stiamo forzatamente cambiando il layout di tutte le sottoview di quel campo di testo. Dopotutto, UITextField è composto da UIView e Label e altri elementi di base. Ma quando proviamo a layoutvisualizza il suo layout mutevole di tutte le sottoview contemporaneamente. Ecco perché il rimbalzo è finito.

+1

Non chiamare mai -visualizzare direttamente le visualizzazioni. Invece call -layoutIfNeeded. – Andy

+0

Ho provato layoutIfNeeded ma non ha funzionato in iOS 8. Lo sto facendo perché UITextField è composto da diversi UIControls, di cui uno è UILabel che sta saltando e se facciamo layoutIfNeeded penso che non cambi il suo layout come necessario. Si prega di controllare in iOS 8 aggiungendo layoutIfNeeded. Non funzionerà e questo è il motivo per cui questa domanda postata penso. Ma ora in iOS 9 potrebbe funzionare. Non ne sono sicuro. –

+0

Solitamente si chiama setNeedsLayout prima di layoutIfNeeded per dire a UIKit che questa particolare vista deve aggiornare il layout. C'è un certo ordine e un'infrastruttura interna che gestisce gli aggiornamenti e si assicura che funzionino correttamente con entrambe le vecchie "molle e montanti" e Autolayout. Lo faccio perché funziona non è una spiegazione. Potresti causare più danni e incoerenze nell'interfaccia utente se disponevi di un layout dell'interfaccia utente più complesso. Come da documentazione, non dovresti mai chiamare manualmente layoutsubviews indipendentemente dagli effetti collaterali che vedi, anche se questo risolve il tuo problema. (molto probabilmente temporaneamente) – Andy

2

Sembra che per qualche motivo l'interfaccia utente non sia in uno stato predefinito prima dell'attivazione dell'animazione.

Prova ad aggiungere una chiamata al [self.view layoutIfNeeded]; prima del vostro blocco di animazione, e utilizzare [self.view layoutIfNeeded]; alla fine del blocco, piuttosto che [self.view layoutSubviews]; che non dovrebbe davvero essere usato in questo contesto.

1

Per iOS 9 o superiore, questo risolve il problema

Objective-C:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch 
    //...other stuff 
} 

Swift:

func textFieldDidEndEditing(_ textField: UITextField) { 
    textField.layoutIfNeeded() //Fixes iOS 9 text bounce glitch 
    //...other stuff 
    } 

Google mi porta qui. Sotto la risposta di @Mahesh Agrawal, @Andy commenta un collegamento che si collega a Here che è la soluzione migliore che posso trovare per questo problema.

Problemi correlati