2013-02-21 8 views
18

Ho una sottoclasse personalizzata UITableViewCell che ha applicato vincoli di autolayout in Interface Builder. La cella contiene più viste, incluso un UITextField.dequalificato UITableViewCell ha un layout errato fino a scorrimento (utilizzando il caricamento automatico)

Pertinente, la dimensione di UITextField è limitata in modo tale che vi sia una spaziatura orizzontale predefinita tra questa e la vista successiva.

La cella viene istanziata come segue:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"ProgressCell"; 
    ProgressCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                forIndexPath:indexPath] 

    cell.textField.text = @"Some string that is different for each cell"; 

    return cell; 
} 

Quando appare per la prima cella, il UITextField sovraccarichi di telaio corretta, e appare dietro il UIView alla sua destra. Tuttavia, quando faccio scorrere la cella fuori dallo schermo, metto in pausa e quindi lo scorrimento indietro, il testo viene troncato correttamente.

Un esempio è mostrato sotto (a seconda modifica).

Ho provato a chiamare [cell setNeedsLayout] e [cell setNeedsDisplay] per la cella in cellForRowAtIndexPath, oltre a eseguirli dopo un ritardo. Né è efficace.

Che scorre fuori dallo schermo facendo che sta causando la cellula di apparire in modo corretto, e come posso né replicare questo o risolvere il problema di fondo?

EDIT:

Calling

[self.tableView reloadData]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

al fine di ricaricare il cellulare, sembra causare il layout di apparire in modo corretto prima volta.

Tuttavia, ora interrompe (occasionalmente) sullo scorrimento (ovvero, quando si esegue il backup, i vincoli di layout non vengono ora applicati correttamente).

Calling [cell setNeedsLayout] in cellForRowAtIndexPath sembra non per risolvere questo problema.

EDIT2:

La cella in alto, come mostrato here, è apparso correttamente (come la cella in basso fa) fino a quando ho scorrere verso il basso dello schermo. Da allora è scomparso.

Ciò riflette il problema a partire dalla prima modifica - E 'il secondo di rendering che è il problema (mi fa pensare che potrebbe avere qualcosa a che fare con il riutilizzo della cellula?)

+0

State ottenendo eventuali avvisi circa i vincoli nella console? – rdelmar

+0

Puoi includere alcuni screenshot? – jrturton

+0

@rdelmar Ho scritto la mia categoria di Autolayout (non ne abbiamo discusso prima?) Se sei interessato: http://commandshift.co.uk/blog/2013/02/20/creating-individual-layout-constraints/ – jrturton

risposta

36

Se è il nome di una proprietà su un UITableViewCell sottoclasse textLabel o defaultTextLabel, allora IB ignorerà i vincoli specificati e sovrascrivere con quelli di default, senza avvertimenti.

Questo è il caso anche su celle progettate in IB con lo stile personalizzato, che non hanno proprietà visibili textLabel o detailTextLabel.

Ciò si verifica anche se si aggiunge una proprietà di tipo UIImageView in una sottoclasse UITableViewCell e denominata imageView.

+4

Lo stesso vale per la proprietà "imageView". – RickiG

+4

Questa risposta deve essere promossa nel riferimento alla classe UITableViewCell, ho appena sprecato 4 ore della mia vita. le sue 4 del mattino ... – atreat

+0

Grazie mille. Mi hai appena salvato diverse ore della mia vita. –

4

In conformità a questa multiple lines UILabel GitHub issue, questo è un persistente iOS bug.

Ho scoperto che in iOS 9+, questa situazione si verifica principalmente in modalità di modifica, con molta imprevedibilità.

La seguente soluzione alternativa funziona solo parzialmente: è necessario ridisegnare lo UITableView due volte e continua a non coprire tutti gli scenari.

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.setNeedsLayout() 
    tableView.layoutIfNeeded() 
    tableView.reloadData() 
} 

Note:

  • Utilizzando UITextView è una grande alternativa a più righe UILabel, senza il bug. UITextView non presenta nessuna delle altre stranezze IULabel, come alignment errors o flickering.
  • C'è anche una soluzione alternativa su SO-25947146, che non ha funzionato per me, ma vale la pena menzionarla.
  • sembra verificarsi quando prominente self.tableView.editing è true
  • Utilizzando valori bassi per tableView.estimatedRowHeight riduce l'insorgenza
  • dimostrazione del bug sulla SwiftArchitect/TableViewControllerRowHeightBug succo
Problemi correlati