Ajustar una altura UIScrollView basada en un UITableView

Tengo un UIScrollView que contiene una UIView y una UITableView. Mi objective es ajustar la altura de UIScrollView para permitirme desplazar el contenido de UIScrollView a un punto específico.

Aquí está mi opinión: tiene una vista superior de UIView y una vista de UITable abajo.

introduzca la descripción de la imagen aquí

Cuando me desploop, quiero que UIView se detenga en un punto específico así: introduzca la descripción de la imagen aquí

El tableView podría continuar desplazándose, pero la UIView se bloquearía en su lugar hasta que el usuario se desplazara y devolviera la UIView a su estado original.

Un buen ejemplo de lo que estoy tratando de hacer es la AppStore.app en iOS 6. Cuando ve los detalles de la aplicación, la barra de filter para Detalles, Comentarios y Movimientos relacionados en la parte superior de la pantalla y se detiene. Espero que todo tenga sentido.

Gracias

Terminé con un enfoque más simple. No puedo creer que no vi esto antes. Creé dos vistas, una para tableHeaderView de UITableView y otra para viewForHeaderInSection. La vista que quería permanecer visible en todo momento se coloca en el método viewForHeaderInSection y la otra vista se coloca en la propiedad tableHeaderView. Este es un enfoque mucho más simple, creo que usar una scrollview. El único problema con el que me he topado con este enfoque es que todas mis animaciones UIView en estas dos vistas ya no se animan. Aquí está mi código.

[self.tableView setTableHeaderView:self.headerView]; - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { return self.tableViewHeader; } 

añádase como un UIScrollViewDelegate a UITableView e implemente el desplazamiento - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView para que si sus vistas están en sus posiciones - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView , hagan esto:

– tu UITableView anima su tamaño al segundo estado:

  [UIView animateWithDuration:.1f animations:^{ CGRect theFrame = myView.frame; theFrame.size.height += floatOfIncreasedHeight; myView.frame = theFrame; }]; 

– tu UIView anima su movimiento vertical

  [UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionCurveLinear animations:^(void){ view.center = CGPointMake(view.center.x , view.center.y + floatOfVerticalMovement); }completion:^(BOOL Finished){ view.center = CGPointMake(view.center.x , view.center.y - floatOfVerticalMovement);] 

Finalmente siempre en el implemento delegado – scrollViewDidScrollToTop: para que sepa que puede volver a animarse al estado inicial (utilizando las mismas técnicas invertidas).

ACTUALIZAR:

ya que sus vistas están dentro de una vista de desplazamiento, hay una manera más simple si está de acuerdo con que la vista de la tabla esté parcialmente fuera de límites en su position inicial (es decir, en lugar de cambiar el tamaño simplemente se desplaza a la vista):

haga que el tamaño de marco de vista de desplazamiento sea tan grande como su vista de tableview final + su vista inicial (completa) y colóquela en 0,0 (por lo que su parte final se ocultará fuera de la pantalla)

 scrollview.frame = CGRectMake(0,0,tableview.frame.size.width,tableview.frame.size.height + view.frame.size.height); 

usted hace que el contenido de scrollview del contenedor scrollview tan grande como la vista de tabla completa + la vista completa + la cantidad de vista que desea scrollview cuando se desplaza la vista de tabla.

 scrollview.contentSize = CGSizeMake(scrollview.frame.size.width, tableview.frame.size.height + view.frame.size.height + floatOfViewHeightIWantOutOfTheWay); 

coloca la vista una tras otra en la vista de desplazamiento dejando todo el espacio vacío adicional después de la vista de tabla

 view.frame = CGRectMake(0,0,view.frame.size.width, view.frame.size.height); tableview.frame = CGRectMake(0,view.frame.size.height, tableview.frame.size.width, tableview.frame.size.height); 

ahora debería funcionar porque el scrolling nested de iOS 3 es compatible

Puede lograr esto fácilmente configurando el tamaño de contenido de scrollView correctamente y manteniendo la altura de UITableView más pequeña que la altura de su viewcontroller, para que se ajuste a la parte inferior de la parte superior UIView y UITableView …

Otro escenario es dividir la Vista superior en 2 partes. La parte que se desplazará y la parte que será visible.

Luego establezca la parte que se desplazará como el encabezado UITableView completo y la parte que permanecerá visible como la vista de encabezado para la primera sección de la tabla. Entonces, puede lograr esto con un único UITableView, sin tener que usar un UIScrollView

Lo que está buscando es algo así como lo que hace Game Center con su encabezado, que en realidad se puede modelar con un encabezado de tabla, una vista de encabezado de sección personalizada y algunos cálculos muy inteligentes que nunca involucran jugar con el marco y los límites de la table.

Primero, la parte fácil: fingir una vista pegajosa. Esa "vista que siempre está presente cuando se desplaza la tabla" se implementa como un encabezado de sección. Al hacer el número de secciones en la tabla 1 e implementar -headerViewForSection: es posible hacer que la vista se desplace sin problemas con la vista de tabla de forma gratuita (API):

 - (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section { UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,50)]; label.text = @"Info that was always present when scrolling the UITableView"; label.textAlignment = UITextAlignmentCenter; label.backgroundColor = [UIColor colorWithRed:0.243 green:0.250 blue:0.253 alpha:1.000]; label.textColor = UIColor.whiteColor; return label; } 

Finalmente, la parte difícil: KVO. Cuando la tabla se desplaza, tenemos que mantener el encabezado allí pegado en lo que respecta a la parte superior del marco de la vista, lo que significa que puede desactivar el contenido de contentOffset y utilizar el cambio resultante en el valor para aproximar el fotogtwig al que la vista debe ajustarse un poco de magia MIN() . Suponiendo que su encabezado tiene 44 píxeles de alto, el código a continuación calcula el valor del marco apropiado:

 CGPoint offset = [contentOffsetChange CGPointValue]; [self.tableView layoutSubviews]; self.tableView.tableHeaderView.frame = CGRectMake(0,MIN(0,offset.y),CGRectGetWidth(self.scrollView.frame),44); 

Si lo anterior es inviable, SMHeadedList tiene un ejemplo bastante grande y poco conocido de lo complicado que puede ser implementar una "vista de tabla doble". Esa implementación tiene el beneficio adicional de permitir que la vista de tabla del "encabezado" se desplace con la vista de tabla "principal".

Para futuros visitantes, he implementado una versión mucho más simple , aunque una que logre el objective con Reactive Cocoa, y un resultado un poco diferente. Aun así, creo que puede ser relevante.

¿Qué pasa si rompe la UIView en la parte superior e inferior? La parte inferior será la información.
Establezca UITableView.tableHeaderView = topView en viewDidLoad
y la vista bottomView retorno como encabezado de sección en el método de delegado para que flote:

 (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section { return bottomView; } 

Solo el uso de UITableView puede resolverlo con su problema. No es necesario usar otra vista de desplazamiento.

  1. configure su vista como la vista de encabezado de UITableView. Luego, agregue su vista actual a la vista del encabezado.
  2. complete - (void)scrollViewDidScroll:(UIScrollView *)scrollView; . En la function para verificar el set de contenido de la vista de desplazamiento, y establecer el marco de la vista actual.