2011-10-04 16 views
8

Mi sono frustrato con questa domanda per un paio di giorni. Sto cercando di aggiungere un UILabel a un UITableViewCell. Voglio che UILabel si estenda per l'intera larghezza della cella, meno 5 o 10 su entrambi i lati destro e sinistro per gli sguardi. Il mio problema è nel determinare a livello di codice la dimensione del frame della cella in cui posizionare l'etichetta. Indipendentemente dal tipo di UITableViewStyle che utilizzo, il valore di cell.contentVew.frame.size.width non è affatto vicino alla larghezza della cella stessa.Recupero di un frame UITableViewCell

Ad esempio, nella tabella che sto costruendo, posso raggiungere il mio risultato desiderato sottoclassi UITableViewCell e creando un UILabel con una larghezza determinata manualmente (tramite solo tentativi ed errori) da:

CGRectMake(10, 12, 397, self.contentView.frame.size.height); 

Ma è quel numero 397 che mi tormenta. Voglio un modo per determinare a livello di codice ciò che dovrebbe essere per qualsiasi tabella o stile di larghezza. Questo dovrebbe essere un processo semplice, basta determinare la larghezza dell'intero frame della cella e quindi sottrarre 10 o 20 in modo che i bordi di UILabel non tocchino effettivamente il bordo della cella.

Tuttavia, se ho impostato il tableViewStyle per UITableViewStyleDefault e quindi provare:

NSLog(@"Width: %f", self.contentView.frame.size.width); 

ricevo 320. Se ho impostato lo stile per una qualsiasi delle altre tre stili, il numero restituito è 302. Anche il 320 il numero non è vicino alla larghezza della cornice della cella (come con il mio numero determinato manualmente di 397).

Quale valore devo accedere per restituire l'intera larghezza della cornice del disegno della cella? Sono sicuro che, come con la maggior parte dei problemi irritanti, la soluzione mi farà venire voglia di darmi una pacca sulla fronte, ma sono al punto in cui sono pronto per questo ora.

EDIT per ulteriori informazioni:

Un chiarimento a chiunque sia interessato. Questa mia domanda riguarda principalmente una tabella di stile raggruppata. Per uno stile semplice, la risposta alla mia domanda di cui sopra può essere determinato semplicemente nel metodo cellForRowAtIndexPath da:

CGFloat cellWidth = [tableView rectForRowAtIndexPath:indexPath].size.width; 

Il problema che sto avendo è che il metodo rectForRowAtIndexPath restituisce la larghezza della cornice in cui la cella è disegnato, che va bene per una tabella di stile semplice poiché la larghezza della cella è l'intera larghezza della cornice. Tuttavia, in una tabella raggruppata, la larghezza della cella è inferiore alla larghezza del frame in cui è disegnata, quindi questo metodo restituirà un numero che è un po 'più largo della larghezza della cella. È possibile che la larghezza della cella in uno stile di tabella raggruppato sia un numero fisso inferiore alla larghezza della cornice della tabella, quindi questo potrebbe essere il modo per risolvere il problema. Lo esaminerò e risponderò alla mia domanda qui, se è così.

+0

Ottima domanda Ho lo stesso identico comportamento e mi fa impazzire. La soluzione alternativa era non pensare alle dimensioni del fotogramma e fare semplicemente riferimento alla larghezza delle sottoview in percentuale della dimensione della vista del contenuto.Sono abbastanza sicuro che il riquadro di visualizzazione del contenuto escluda le aree a sinistra ea destra della cella riservata agli accessori (sposta, elimina, rivela, ecc.) Ma continua a non rispondere al motivo per cui i fotogrammi delle celle riportano sempre la dimensione errata . Spero che qualcuno arriverà a dare un senso a tutto questo. – Rog

+0

È in paesaggio? –

+0

@Bartosz - Nel mio esempio, sto ottenendo i numeri dal ritratto. – Chris

risposta

8

Ho determinato la mia risposta, e spero che aiuti chiunque debba affrontare lo stesso problema. Il calcolo del margine di una tabella raggruppataVedo trovato su this StackOverflow answer.

Questo codice fornirà un'etichetta all'interno di una cella TableView che si estende sulla cella con un margine tra i due bordi della cella e centrata verticalmente all'interno della cella.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *label; 
    CGFloat groupedStyleMarginWidth, tableViewWidth; 
    UIFont *labelFont = [UIFont boldSystemFontOfSize:17.0]; // Set to whatever you like 
    NSString *labelText = @"Test String"; 

    // Calculate the margin between the cell frame and the tableView 
    // frame in a grouped table view style. 
    tableViewWidth = tableView.frame.size.width; 
    if (tableView.style == UITableViewStyleGrouped) { 
     if (tableViewWidth > 20) 
      groupedStyleMarginWidth = (tableViewWidth < 400) ? 10 : MAX(31, MIN(45, tableViewWidth*0.06)); 
     else 
      groupedStyleMarginWidth = tableViewWidth - 10; 
    } 
    else 
     groupedStyleMarginWidth = 0.0; 

    if (cell == nil) { 
     CGRect tableViewRect; 
     CGRect labelRect; 
     CGFloat x, y, w, h, labelMargin; 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     // Retrieve the rect of the table view. 
     tableViewRect = [tableView rectForRowAtIndexPath:indexPath]; 

     // Set whatever margin around the label you prefer. 
     labelMargin = 10; 

     // Determine rect values for the label. 
     x = tableRect.origin.x + labelMargin; 

     // Calculate width of label 
     w = tableRect.size.width - (groupedStyleMargin * 2) - (labelMargin * 2); 

     // Calculate height of table based on font set earlier. 
     h = [labelText sizeWithFont:font].height; 

     // Calculate y position for the label text baseline to center 
     // vertically within the cell. 
     y = (tableRect.origin.y/2) - (h/4); 

     labelRect = CGRectMake(x, y, w, h); 

     label = [[UILabel alloc] initWithFrame:labelRect]; 
     label.text = labelText; 
     label.tag = 0; 
     [cell.contentView addSubview:stepLabel]; 
     [label release]; 
    } 
    else { 
     label = (UILabel *)[cell viewWithTag:0]; 
    } 
1

Suoni come questo sarebbe meglio essere gestiti da vincoli di layout automatico al giorno d'oggi.

Problemi correlati