2012-04-25 14 views
6

Estoy tratando de cambiar el tamaño de la altura de la tabla con una animación, funciona bien al animar frame.size.height de la tabla.Cambiar el tamaño de la altura de UITableView, y seguir desplazándose en la parte inferior

El problema es que tengo una tableview que es 200 píxeles de altura y desplazado hasta el fondo, quiero animar esta a 100px, corro un simple

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

esto funciona bien, pero después de que redimensiona ya no se desplaza al final de la tabla. Quiero que la vista de tabla siempre se dispare en la parte inferior mientras se anima. He intentado muchas cosas differnet como llamar

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

justo antes/después de que iniciar la animación de cambio de tamaño, pero no he logrado conseguir que se sincronizan 100%. ¿Hay alguna manera de cambiar el tamaño de la vista de tabla mientras que la parte inferior de la vista de tabla muestra el último elemento de la vista de desplazamiento?

+0

Utilice [UIView animateWithDuration: animaciones: finalización:] en su lugar? – onnoweb

+1

Quiero que la scrollanimation ocurra con la animación de cambio de tamaño no después, pero gracias :) –

Respuesta

2

he encontrado una solución para mi problema, que podría muy bien ser una solución mejor, pero esto en realidad funciona bastante bien :)

antes de que comience la animación que veo es si el contentSize.height mayor que la altura del objetivo, por lo que si siguiente:

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; 
} 

esto pondrá el tableview en un origin.y menos, entonces he envuelto el tableview dentro de un UIView "padre" con vistas clip de sub = SÍ.

Luego tengo un bloque de animación "completado" que "restablece" a los valores objetivo.

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

Intente actualizar contentOffset de la vista de tabla mientras anima el marco.

[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

Gracias por el consejo, me temo que no parece que lo quiera, después de hacer un poco de excavación parece configurar el contentOffsetY mientras se anima el la altura da un comportamiento extraño (lo siento pero algo difícil de explicar). Pero el resultado no es que la parte inferior de la tabla se anima hacia arriba mientras se cambia el tamaño. –

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

Quiero que ocurra la scrollanimación con la animación de cambio de tamaño no después, pero gracias :) –

0

Desplazamiento del tableview a la parte inferior del bloque de animación trabajaba para mí, con un pequeño giro: cuando he reducido la altura de la tableView llamé scrollToIndexPath sin animación, y cuando amplío la tableView Me llama la scrollToIndexPath con animación.

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) 
    } 
} 

extensión para 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) 
    } 
} 
Cuestiones relacionadas