2009-05-22 2 views
6

Sto cercando di ottenere un UISegmentedControl in un gruppo UITableViewCell come nelle impostazioni Wi-Fi nell'applicazione di impostazione. Il problema che sto avendo è che sto avendo un doppio confine. Ricevo un bordo per lo UISegmentedControl e uno per lo UITableViewCell.UITableViewCell/UISegmentedControllo problema di confine

Suppongo di dover rimuovere il bordo dallo UITableViewCell. Come posso fare per farlo?

+2

Uno stile suggerimento minore: utilizzando la corretta capitalizzazione del i nomi delle classi nel titolo della domanda renderebbero molto più facile la lettura. Puoi cambiarlo dopo il fatto. Scusa se non ho una risposta, al momento eseguo solo app desktop. –

risposta

7

Ho appena notato che questo continua a ricevere risposte. Come succede, ho dovuto farlo per un altro progetto e da quando ho fatto questa domanda ho imparato molto di più su iPhone dev. Ecco come l'ho risolto di recente. Si tratta di rendere la cornice delle dimensioni corrette. Questo dovrebbe farlo per un tavolo standard.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; 
if(cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"] autorelease]; 

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(-1.0f, -1.0f, 302.0f, 46.0f)]; 
[cell.contentView addSubview:segmentedControl]; 
+1

@ daniel-wood: i numeri che hai dato sono giusti per la modalità verticale, ma non funzioneranno in orizzontale. Votando per quello :) –

+0

Ah, vero. Immagino che potresti fare tableView.frame.size.width - 18.0f per la larghezza. Tutti gli altri valori dovrebbero essere uguali. –

1

Ho ottenuto un po 'più di questo. Finora ho sottoclasse UITableViewCell. Ho creato un pennino con un UISegmentedControl in esso e ho impostato lo sfondo alfa di UITableViewCell su 0. Non sembra ancora abbastanza corretto, ma è migliore di prima.

0

Il trucco sembra essere quello di dimensionare il UISegmentedControl alle dimensioni del backgroundView del controllo, non lo contentView. Sono stato in grado di farlo a livello di codice nel seguente modo:

// Size to cover the entire background 
    self.contentView.frame = self.backgroundView.frame; 
    self.myControl.frame = self.contentView.bounds; 

Si noti che se si utilizza un accessorio, è necessario tenere conto della accessoryView pure.

La ragione è che la gerarchia della vista è la seguente:

  • self (la UITableViewCell o sottoclasse)
    • backgroundView
    • contentView
      • (i controlli vanno qui)
    • accessoryView

In layout verticale, il backgroundView 's telaio è {{9, 0}, {302, 44}}, mentre la contentView' s telaio è leggermente più piccolo, a {{10, 1}, {300, 42}}. Questo dà alla cella il suo "bordo" 1px quando lo stile della tabella è raggruppato. Devi ridimensionare sia il contentViewe il il tuo controllo per ottenere la dimensione appropriata.

(NOTA:. Anche se Apple ha effettivamente diversi esempi di un UISegmentedControl nel progetto di codice di UICatalog di esempio in the SDK, hanno effettivamente "barare" utilizzando un UIViewController e impostando il colore di sfondo della vista principale al colore di sfondo della tabella)

+0

Il codice di esempio del controllo segmentato a cui si fa riferimento utilizza una vista generica, non una vista tabella, per visualizzarne i controlli; sembra una visualizzazione di tabella raggruppata solo perché usa quel colore di sfondo. –

+0

Scavato e trovato la risposta giusta. Tenuto un riferimento alla mia vecchia risposta, così gli altri sono consapevoli che l'esempio di Apple in realtà non lo fa. –

3

Nel caso delle impostazioni Wi-Fi, ho il sospetto che ciò che hanno fatto sia stato il pulsante "Dimentica questa rete", l'etichetta "Indirizzo IP" e il controllo segmentato "DHCP/BootP/Static" tutto il la vista dell'intestazione della tabella. Se hai bisogno di farlo al centro del tuo tavolo (al contrario in alto o in basso, per il quale utilizzerai rispettivamente le proprietà tableHeaderView e tableFooterView), ti suggerisco di utilizzare i metodi delegati -tableView:viewForHeaderInSection: con -tableView:heightForHeaderInSection o corrispondenti varianti Footer. Con uno di questi, avresti impostato una visualizzazione personalizzata per quella "sezione" della tua vista tabella (utilizzando un colore di sfondo chiaro o [UIColor groupTableBackgroundColor]), contenente un'etichetta e un controllo segmentato disposti in modo che corrispondessero al resto di le sezioni della tabella.

2

Utilizzando la tecnica in this post per rimuovere l'opacità del UITableViewCell sfondo lavorato più facilmente per me per ottenere solo l'UISegmentedControl per mostrare nella riga della tabella.

+0

Questo è il modo giusto per farlo: rendere il frame del controllo uguale a 'cell.contentView.bounds', impostare' autoresizingMask' su 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight', aggiungi il controllo come sottoview di 'cell.contentView' e imposta' cell.backgroundView' su 'UIView' trasparente. –

1

La soluzione è consentire il ridimensionamento del controllo segmentato per adattarlo e nascondere lo sfondo della vista tabella in tableView:willDisplayCell:forRowAtIndexPath:.

questo produce risultati identici alla "Settings.app> WiFi> la rete> Indirizzo IP" controllo segmentato senza codificare metriche di layout:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]]; 
    control.segmentedControlStyle = UISegmentedControlStylePlain; 
    control.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    control.frame = cell.contentView.bounds; 
    [cell.contentView addSubview:control]; 
    [control release]; 
} 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.backgroundView.alpha = 0.0; 
}