2013-07-10 17 views
19

Desidero utilizzare il layout automatico per UITableViewCells. Queste celle di tabella hanno un'altezza dinamica (a seconda della lunghezza del testo).Chiamare `[UIView -systemLayoutSizeFittingSize:]` su un UITableViewCell fallisce sempre

sto usando [UIView -systemLayoutSizeFittingSize:] per calcolare l'altezza della cella appropriata (per tornare in [UITableView -heightForRowAtIndexPath:]), ma continuo a ricevere i seguenti risultati:

  • Se mi passa UILayoutFittingCompressedSize, torno un CGSize di (0, 0).

  • Se mi passa UILayoutFittingExpandedSize, i miei applicazione si blocca con questo errore:

    *** Assertion failure in -[NSISLinearExpression incrementConstant:], /SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620

(La mia ipotesi è che questo significa qualche numero è infinito.)

mia implementazione è semplice. A calcolare l'altezza di ciascun oggetto, e quindi nella cache è:

MessageCell *cell = // allocate a new cell... 

// set up the cell (assign text, images, etc) 

CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

self.cellHeight = size.height; // size always equals (0, 0) 

ipotizzo che questo è un problema con i vincoli che ho impostato, ma:

  • Se fisso manualmente cellHeight un valore elevato , le celle sembrano tutte belle, tranne che l'altezza è sbagliata.
  • Interface Builder non mi avvisa di restrizioni ambigue
  • [cell hasAmbiguousLayout] restituisce NO.
  • La mia cella ha, tra le altre cose, un'immagine impostata su 48x48, quindi una dimensione di (0, 0) non dovrebbe soddisfare tutti i vincoli.

Qualche idea?

+1

ho incontrare lo stesso problema come il vostro, hanno a risolvere il problema? – ygweric

risposta

34

Questo è ciò che funziona per me (si noti 'contentView')

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

EDIT: ho risposto a una domanda simile e ha fornito un esempio completo, qui:

How to resize superview to fit all subviews with autolayout?

+1

Questo ha funzionato per me. – Camsoft

+0

Questa era la chiave per me. Se i miei vincoli di layout automatico sono corretti, tutto ciò che devo fare in [UITableView -heightForRowAtIndexPath:] è restituito [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] .height; e le righe si ridimensionano al loro nuovo layout. Semplice. –

2

È difficile dire qualcosa di concreto che si basa sul tuo post perché non hai inserito i vincoli che usi. di Apple Documentazione:

systemLayoutSizeFittingSize:

Returns the size of the view that satisfies the constraints it holds.

Forse ti ha creato vincoli che possono essere interpretati nel senso delle dimensioni della cella è pari a (0,0).

C'è un altro modo per controllare l'altezza della cella con il testo. È possibile inserire il testo nel UITextView e poi:

UITextView textView; 
textView.text = @"l"; 
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE]; 
//some code here 
// 
CGFloat cellHeight = textView.contentSize.height; 

E 'importante per impostare il testo e il carattere (e di ogni altra proprietà che può causare il cambiamento dell'altezza del UITextView) del UITextView prima di utilizzare contentSize proprietà. Inoltre, devi prima aggiungere UITextView alla vista.

////// EDIT

Il problema con il vostro approccio con l'utilizzo di vincoli può essere che si vuole misurare la cellula che non viene aggiunto alla visualizzazione in modo che il sistema non hanno tutte le informazioni di cui ha bisogno.Non sa quanto spazio che sarà per lo spazio, ecc, perché non conosce la zona circostante della cella

+0

Quest'ultimo approccio è quello che sto facendo ora e quello che voglio smettere di fare. (Bene, sto usando '[NSString -sizeWithFont: constrainedToSize:]', ma la stessa idea di base). Il mio UITableViewCell contiene una sottoview, un UIImageView, con quattro vincoli (altezza = 48, larghezza = 48, spazio iniziale a contenitore = 10, spazio superiore a contenitore = 10). Non dovrebbe farlo solo systemLayoutSizeFittingSize: 'return, come minimo, (58, 58)? –

+0

Sembra che dovrebbe funzionare. Mantieni la tua immagine in UIImageView e viene aggiunta alla vista cella? Inoltre, penso che questa idea con l'utilizzo di UITextView sia probabilmente migliore rispetto all'utilizzo dei metodi NSString perché ho avuto alcuni problemi con NSString quando si lavora con stringhe multiline. –

Problemi correlati