2012-04-25 6 views
6

Sto tentando di ridimensionare l'altezza della vista della tabella con un'animazione, funziona bene animando il frame.size.height di tableview.Ridimensiona l'altezza di UITableView e continua a scorrere in basso

Il problema è che io ho un Tableview che è 200px di altezza e scorrere fino in fondo, voglio animare questo per 100px, ho eseguito un semplice

[UIView animateWithDuration:0.245f animations:^{ 
CGRect frame = tableview.frame; 
frame.size.height = 100.f; 
tableview.frame = frame; 
}]; 

questo funziona bene, ma dopo che ho ridimensionato esso non viene più spostato in fondo alla tableview. Voglio che la vista tabella sia sempre scorsa in basso durante l'animazione. Ho provato un sacco di cose differnet come chiamare

[tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

destra prima/dopo che avviare l'animazione di ridimensionamento, ma io non sono riuscito a farli sincronizzare 100%. C'è un modo per ridimensionare la vista tabella mentre la parte inferiore della vista tabella mostra l'ultimo elemento della vista a scorrimento.

+0

Usa [UIView animateWithDuration: animazioni: completamento:], invece? – onnoweb

+1

Voglio che lo scrollanimation si verifichi con l'animazione di ridimensionamento non dopo, ma grazie :) –

risposta

2

ho trovato una soluzione per il mio problema, ci potrebbe benissimo essere una soluzione migliore, ma questo in realtà funziona abbastanza bene :)

prima di iniziare l'animazione vedo se il contentSize.height è più grande di l'altezza della mira, se in modo che io seguente:

if (mMessages.contentSize.height > 150.f) 
{ 
    CGFloat expandedOffsetY = 52.f; 
    CGFloat collapsedBottomOffset = (150.f + 18.f); 
    CGFloat expandedBottomOffset = (MIN(320.f, mMessages.contentSize.height) + expandedOffsetY); 
    tableFrame.origin.y = (collapsedBottomOffset - expandedBottomOffset) + expandedOffsetY; 
} 
else 
{ 
    tableFrame.origin.y = 18.f; 
    tableFrame.size.height = 150.f; 
} 

questo metterà la Tableview in un origin.y meno, poi ho avvolto il Tableview all'interno di un UIView "padre" con vista sub clip = YES.

Quindi ho un blocco di animazione "completato" che "si reimposta" ai valori di destinazione.

CGRect tableFrame = mMessages.frame; 
tableFrame.origin.y = 18.f; 
tableFrame.size.height = 150.f; 
mMessages.frame = tableFrame; 

if (mMessages.contentSize.height > tableFrame.size.height) 
{ 
    float contentOffsetY = mMessages.contentSize.height - tableFrame.size.height; 
    mMessages.contentOffset = CGPointMake(0.0f, contentOffsetY); 
} 
0

Provare ad aggiornare il contentOffset della vista tabella mentre si anima il fotogramma.

[UIView animateWithDuration:0.245f animations:^{ 
CGRect frame = tableview.frame; 
frame.size.height = 100.f; 
tableview.frame = frame; 

float contentOffsetY = tableview.contentSize - tableview.frame.size.height; 
tableview.contentOffset = CGPointMake(0, contentOffsetY); 

}]; 
+0

Grazie per il consiglio, ho paura che non sembri lo voglio, dopo aver fatto un po 'di scavo sembra impostare il contenutoOffsetY mentre si anima il l'altezza dà alcuni comportamenti strani (scusate ma un po 'difficile da spiegare). Ma il risultato non è che la parte inferiore della vista tabella si animi verso l'alto durante il ridimensionamento. –

0
[UIView animateWithDuration:0.245f animations:^{ 
     CGRect frame = tableview.frame; 
     frame.size.height = 100.f; 
     tableview.frame = frame; 
} completion:^(BOOL finished) { 
     // Find your last indexpath 
     [tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} ]; 
+0

Voglio che la scrollanimation si verifichi con l'animazione di ridimensionamento non dopo, ma grazie :) –

0

Scorrendo la Tableview verso il basso nel blocco di animazione stava lavorando per me, con un po 'di torsione: quando ho ridotto l'altezza del tableView ho chiamato scrollToIndexPath senza l'animazione e quando espando la tableView Ho chiamato la scrollToIndexPath con animazione.

UIView.animate(withDuration: 0.25) { [weak self] in 
    guard let strongSelf = self 
     else { return } 
    // ... 
    // updateConstraints 
    // ... 
    strongSelf.view.layoutIfNeeded() 

    if reduceSize { 
     tableView.scrollToLastRow(animated: false) 
    } else { 
     tableView.scrollToLastRow(animated: true) 
    } 
} 

prolunga per UITableView

extension UITableView { 

    func scrollToLastRow(animated: Bool) { 
     let lastSection = numberOfSections-1 
     let lastRow = numberOfRows(inSection: lastSection)-1 
     let lastIndexPath = IndexPath(row: lastRow, section: lastSection) 
     scrollToRow(at: lastIndexPath, at: .bottom, animated: animated) 
    } 
} 
Problemi correlati