2009-08-23 7 views
17

Si intento animar la altura del fotograma de tableView (por ej .: height -= 200), las celdas que aparecen en los últimos 200 px desaparecen repentinamente antes de que finalice la animación suave del fotograma.Problema de animación de altura de fotograma UITableView

Para asegurarme de que no es otra cosa que estoy haciendo, creé una nueva aplicación basada en la vista. En el principal viewController creo mi propio tableview con suficiente pseudo rows para llenar toda la pantalla. Y en la selección de una fila hago una animación de altura simple.

código más relevante:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.myTable = [[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)] autorelease]; 
    myTable.delegate = self; 
    myTable.dataSource = self; 
    [self.view addSubview:myTable]; 
} 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGRect frame = self.myTable.frame; 
    frame.size.height = 200; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDelay:.5f]; 
    [UIView setAnimationDuration:0.5f]; 
    self.myTable.frame = frame; 
    [UIView commitAnimations]; 
} 

¿Alguien sabe por qué ocurre esto, o lo que puede ser una solución/solución?

Cualquier sugerencia es realmente apreciada. TIA!

Respuesta

0

He encontrado su pregunta al buscar el método adecuado para cambiar el tamaño de un tableView. Creo que su problema está en la animación que ha especificado UIView en lugar de UITableView. No pude duplicar el problema utilizando UIView o UITableView, pero estoy usando SDK 3.1 y es posible que se haya solucionado un error desde su publicación. No estoy seguro, pero espero que esto ayude!

+0

No, es correcto usar métodos "UIView" para las llamadas de animación. – rluba

+0

Probé el mismo código con 3.1 también, y todavía es un problema para mí;/Mi solución actual es esperar a que termine la animación antes de cambiar el tamaño de la tabla – dizy

0

Tengo exactamente el mismo problema. Imagino que las tablas tienen un comportamiento especial en "setFrame:", parece que la tabla elimina las celdas que no serán visibles con el nuevo marco.

En el caso de una animación, las celdas no serán visibles solo al final de la animación, pero parece que a las tablas no les importa.

Si alguien tiene una mejor teoría, ¡me encantaría escucharla!

8

Mismo problema aquí también. Esto es lo que estoy haciendo y el origen se anima suavemente, pero el tamaño cambia inmediatamente ... molesto.

[UIView beginAnimations:@"HideTabbar" context:nil]; 
    [UIView setAnimationDuration:.3]; 
     self.tableView.frame = CGRectMake(0.0, 44.0, 320, 366); 
    [UIView commitAnimations]; 

ACTUALIZACIÓN: Trate de añadir esto antes de la animación:

self.tableView.autoresizingMask = UIViewAutoresizingNone; 
+1

Cambiar la máscara de autoresizing a "ninguno" definitivamente funcionó en mi situación. Gracias. – macandyp

15

No estoy seguro de que tenía exactamente el mismo problema, pero utilizando [UIView setAnimationBeginsFromCurrentState:YES]; resueltos (parte de) los problemas técnicos (mi mesa la vista se deslizó locamente al animar un cambio de altura de cuadro).

+1

gracias. lo resolvió para mí. problema: animando la vista externa (marco) - y cambiando el tamaño de una vista de texto interior (solo la nueva altura - pos seguirá siendo la misma) –

3

Esta es una vieja pregunta y ya hay un par de sugerencias para una solución alternativa, pero pensé en agregar la mía.

Terminé animando las propiedades contentInset y scrollIndicatorInsets, lo que proporciona la ilusión de que la tabla se está cambiando de tamaño.

4

Para cualquier persona que responda a esta pregunta & responda en el futuro, así es como usar la respuesta de @ ryyst en las animaciones basadas en bloques de UIView introducidas en iOS 4.

[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      // change frame etc here 
    } completion:^(BOOL finished) { 
      // any clean up here 
    }]; 
0

Es una vieja pregunta pero esto podría ayudar a alguien en el futuro;

He resuelto un problema similar mediante la incorporación de la tableview en un UIView, y cambiar el tamaño de la UIView en lugar de tableview. Establecí la altura tableview's en un valor grande y también la propiedad "subvistas de clip" en el UIView. Cambié el tamaño del UIView proporcional a la vista de tabla contentSize. No es una buena solución, pero funcionó para mis propósitos.

+0

esto causará otro problema, no podrás ver las últimas celdas de tableView porque están dentro del marco de tableView pero lejos debajo del marco visible del contenedorUIView, por lo que tableView rebotará cuando intentes desplazarte porque ha llegado al final de las celdas y aún así no puedes verlas – Mehdi

0

¡Finalmente encontré la solución! de hecho hay un error !! no use variables, cuando animando la altura use [[UIScreen mainScreen] bounds]. De esta manera:

[UIView animateWithDuration:0.5 animations:^{ 
      tableView.frame=CGRectMake(0, 38, fullScreenRect.size.width, [[UIScreen mainScreen] bounds].size.height-38); 
}]; 
no

:

[UIView animateWithDuration:0.5 animations:^{ 
      tableView.frame=CGRectMake(0, 38, fullScreenRect.size.width, fullScreenRect.size.width-38); 
}]; 

y funcionará como magia!

Cuestiones relacionadas