2010-03-05 11 views
5

Ho una vista tabella con cinque celle che visualizzano le impostazioni della mia app. Voglio che le prime quattro celle appaiano in alto. L'ultima cella non è in realtà un'impostazione, dice "Legal" e ti porta all'EULA, quindi voglio che appaia in fondo.Allinea le celle alla parte inferiore e superiore di UITableView, lasciando una distanza elastica nel mezzo

Ora so che potrei usare – tableView:viewForHeaderInSection: e – tableView:heightForHeaderInSection: per creare un po 'di padding, ma in realtà non mi piace l'hardcoding nelle dimensioni in questo modo. Inoltre non voglio usare UIButton, perché voglio che sia esattamente lo stesso stile del resto delle celle.

Qualcuno conosce le migliori pratiche per fare questo?

risposta

13

Suppongo che tu stia utilizzando una visualizzazione tabella raggruppata, ad esempio l'app delle impostazioni. Quello che ho fatto è creare una sezione di gruppo tra le sezioni del gruppo in alto e in basso, a cui aggiungo una cella di riga 'trasparente', che dimensiono dinamicamente.

Ho creato una semplice demo per te che utilizza valori codificati, ma si spera che tu possa ottenere l'idea. Ovviamente si dovrebbe ottenere il numero di sezioni e il numero di righe dalla struttura dei dati:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    int rtn = 0; 

    if (section == 0) 
     rtn = 4; 
    else if (section == 1) 
     rtn = 1; 
    else if (section == 2) 
     rtn = 1; 

    return rtn; 
} 

/* 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    return 44.0f; 
} 
*/ 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    int TOTALCELLS = 6; 
    float CONSTANT = 0.5f; 

    if (indexPath.section == 1) 
     return self.view.frame.size.height - (44.0f * (CONSTANT + TOTALCELLS)); 

    return 44.0f; 
} 



- (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]; 

    } 



    if (indexPath.section == 0) 
    { 
     if (indexPath.row == 0) { 

      cell.textLabel.text = @"My Switch"; 
      UISwitch *boolSwitch = [[UISwitch alloc]initWithFrame:CGRectZero]; 
      boolSwitch.on = YES; 
      [cell setAccessoryView:boolSwitch]; 
      [boolSwitch release]; 

     } else if (indexPath.row == 1) { 

      cell.textLabel.text = @"My TxtField"; 
      [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
      UITextField *txtField = [[UITextField alloc]initWithFrame:CGRectMake(0,0,175,20)]; 
      txtField.text = @"Default Value"; 
      txtField.textColor = [UIColor darkGrayColor]; 
      [txtField setClearButtonMode:UITextFieldViewModeAlways]; 
      [cell setAccessoryView:txtField]; 
      [txtField release]; 

     } else if (indexPath.row == 2) { 

      cell.selectionStyle=UITableViewCellSelectionStyleNone; 
      UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0,0,280,22)]; 
      slider.minimumValue = 0.0f; 
      slider.maximumValue = 10.0f; 
      slider.value = 0.7f; 
      slider.minimumValueImage = [UIImage imageNamed:@"minus.png"]; 
      slider.maximumValueImage = [UIImage imageNamed:@"plus.png"]; 
      [cell setAccessoryView:slider]; 
      [slider addTarget:self action:@selector(sliderChange:forEvent:) forControlEvents:UIControlEventValueChanged]; 
      [slider release]; 

     } else if (indexPath.row == 3) { 

      cell.textLabel.text = @"My MultiValue"; 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
      cell.detailTextLabel.text = @"Default selection"; 
     } 

    } else if (indexPath.section == 1) { 

     UIView *transCell = [[UIView alloc] initWithFrame:CGRectZero]; 
     transCell.backgroundColor = [UIColor clearColor]; 
     cell.backgroundView = transCell; 
     [transCell release]; 
     [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

    } else if (indexPath.section == 2) { 

     cell.textLabel.text = @"Legal"; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 



    return cell; 
} 

Le parti critiche sono in cellForRowAtIndexPath, dove si crea la riga trasparente. Il trucco qui è di aggiungere la vista trasparente al backgroundView della cella e impostare lo stile di selezione della cella su Nessuno.

UIView *transCell = [[UIView alloc] initWithFrame:CGRectZero]; 
transCell.backgroundColor = [UIColor clearColor]; 
cell.backgroundView = transCell; 
[transCell release]; 
[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

e heightForRowAtIndexPath, il dimensionamento dinamico della riga trasparente.

self.view.frame.size.height - (44.0f * (CONSTANT + TOTALCELLS)); 

TOTALCELLS è il totale di tutte le celle, inclusa quella trasparente. Potrebbe essere necessario svolgere ulteriori attività su questo algoritmo, in quanto non tiene in considerazione ciò che accade quando il numero di celle cresce oltre ciò che è visibile, e non l'ho testato con varie combinazioni di navigazione e barre degli strumenti.

Spero che questo funzioni per voi.

Valid XHTML

+0

Nota-Si potrebbe anche solo omettere il ridimensionamento dinamico, e aggiungere un numero di celle trasparenti per il gruppo di mezzo, al culmine di default (44.0f) –

+0

siete i benvenuti. se apprezzi questa soluzione, apprezzerei un upvote ;-) –

+0

Ottima soluzione, perché funziona solo – Tony

Problemi correlati