Domanda

Sto avendo difficoltà animare un'intestazione di sezione UITableView personalizzato.
L'obiettivo era quello di creare sezioni schiacciabili.
Quando si tocca il personalizzato intestazione la prima volta che anima come previsto, tuttavia ogni volta dopo che lascia un duplicato nella posizione originale ed anima un altro.

Immagine Esempio:

alt text alt text     
   La mia intestazione personalizzata:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
       UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
       customView.backgroundColor = [UIColor lightGrayColor];

       UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
            headerLabel.backgroundColor = [UIColor clearColor];
            headerLabel.opaque = NO;
            headerLabel.textColor = [UIColor darkGrayColor];
            headerLabel.font = [UIFont boldSystemFontOfSize:16];
            headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0);
            headerLabel.textAlignment = UITextAlignmentCenter;
            NSDictionary *dictionary = [self.data objectAtIndex:section];
            headerLabel.text = [dictionary objectForKey:@"Title"];

            [customView addSubview:headerLabel];


            // add button to right corner of section
        UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)];
            headerButton.center = CGPointMake( 160.0, 22.0);
            headerButton.backgroundColor = [UIColor clearColor];
            headerButton.tag = section;
            [headerButton   addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside];

            [customView addSubview:headerButton];

            return customView;
}

Il mio Metodo Animazione:

- (void) expandSection:(id)sender {

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

Io non sono esattamente sicuro che cosa sta succedendo, ma le istanze suggerire che ho bisogno di qualcosa dealoc. Ho provato un paio di cose, ma io non riesco a capire questo fuori. Chiunque aiuto su questo sarebbe grande!

Edit: Credo che il problema è che reloadSections sta causando la visualizzazione personalizzata per esempio. Non posso rilasciare la vista perché ho bisogno come riferimento per fare l'aggiornamento per l'animazione. Tutte le idee su che cosa posso fare per risolvere questo problema?

È stato utile?

Soluzione

soluzione trovata.

La tabella doveva essere ricaricato prima di ogni cambiamento. In questo modo la tabella è al più tardi dello stato prima di apportare modifiche.

add [Self.tableView reloadData]; come la voce di pugno nel metodo "expandSection".

codice:

- (void) expandSection:(id)sender {

  [self.tableView reloadData];

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

Altri suggerimenti

Ho avuto un problema simile che è stato causato da utilizzando cellule di altezza dinamici. Ho avuto una vista espandibile intestazione personalizzata e quando ero aggiornando tableView inserire e rimuovere le righe associate della sezione (che significa che essi erano in espansione, rispettivamente collasso), l'intestazione di sezione che era una sottoclasse di UITableViewHeaderFooterView non è stato riciclato. Quindi, in pratica uno nuovo è stato allocato e ha aggiunto più di quello vecchio con conseguente sovrapposizione di vista. L'identificatore di cella è stata impostata correttamente così deve essere stato qualcos'altro. Quando ho rimosso tableView.sectionHeaderHeight = UITableViewAutomaticDimension e implementato func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat la vista ottenuto correttamente riciclato e solo una vista colpo di testa viene visualizzato per ciascuna sezione.

Un'altra soluzione che mi si rivelò in realtà il lavoro è stato quello di utilizzare UITableViewCell invece di UITableViewHeaderFooterView e quando si torna in func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? appena return cell.contenView, questo sistema funziona perché il metodo richiede di restituire un UIView e poiché la contentView del UITableViewCell è un UIView funziona bene. L'idea è dietro di utilizzare il meccanismo di riciclaggio di UITableView attraverso UITableViewCell e proprio ritorno il suo contenuto dopo la configurazione di esso.

Conclusione. Il problema è molto possibile essere causato da UITableViewHeaderFooterView quando viene utilizzato con sé dimensionamento cellule tableView e UITableViewAutomaticDimension invece di calcolare manualmente altezza della cella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top