ios - UICollectionView dentro del contenedor UIView: didSelectRowAtIndexPath no se llama después del desplazamiento
swift scroll (3)
Debes definir el tamaño del contenido de la vista de desplazamiento
Crea una salida a tu scrollview
@IBOutlet weak var scrollview : UIScrollView!
Haga que su altura sea igual a la suma de las alturas del encabezado, el tabBar y el contenedor:
self.scrollView.contentSize = CGSizeMake(self.view.frame.width, header.frame.height + tabBar.frame.height + container.frame.height)
Tengo 3 UIViews Header / Tabar / Container embedded un a ScrollView en ViewController. Entonces esta es mi estructura:
En el ContainerView cargo un UICollectionView (como este):
let controller = storyboard!.instantiateViewControllerWithIdentifier("myCollectionViewController") as! myCollectionViewController
controller.delegate = self
self.addChildViewController(controller)
controller.view.backgroundColor = UIColor.brownColor()
self.containerView.addSubview(controller.view)
controller.didMoveToParentViewController(self)
Todo funciona perfectamente, cada célula del UICollectionView está cargada, ... El único problema es que todas las celdas ocultas (e incluso todas las partes de las celdas que están ocultas) no son seleccionables. Lo que quiero decir es que mi función "didSelectRowAtIndexPath" no funciona para cada píxel de la primera pantalla. Este es un esquema de mi problema:
Esto es lo que tengo antes del desplazamiento (a la izquierda hay un esquema, a la derecha está lo que realmente tengo en la pantalla) -> aquí todo funciona bien:
Esto es lo que tengo después del desplazamiento (a la izquierda hay un esquema, a la derecha es lo que realmente tengo en la pantalla) -> solo los píxeles que se muestran antes de que el desplazamiento pueda llamar a "didSelectRowAtIndexPath":
El problema reside en el hecho de que self.view.frame no está refrescando bien. ¿Tienes una idea de cómo debería cambiar este marco y cuándo?
Esto parece ser la continuación de otro problema que ha mencionado en otra pregunta .
Mirando la jerarquía del guión gráfico, sospecho que el problema es que no está cambiando la altura de la tab bar view
cuando está cambiando el tamaño del contenido de la vista de desplazamiento y la altura de la vista de la colección. La vista de colección todavía está visible, probablemente porque la tab bar view
contenedor no clipToBounds=false
contenidos ( clipToBounds=false
). Pero dado que la vista en sí no se extiende tan abajo, la vista y sus subvistas no reconocen los toques.
Asegúrese de que la vista principal, la vista de contenido de la vista de desplazamiento (tamaño de contenido), la vista de la barra de pestañas Y la vista de colección se hayan redimensionado correctamente. Ya que ha decidido no ir con la jerarquía de vista estándar (vista suplementaria o vista de encabezado), tiene que manejar la sobrecarga de gestionar los límites de vista usted mismo.
Definición del problema:
Todo el tiempo que enfrentamos es una situación en la que nuestro UIViewController
, además de la vista de desplazamiento, muestra encabezados y barras de pestañas. El problema es que esas vistas adicionales reducen el área asociada a nuestro scroller (en este caso UICollectionView
). En dispositivos de pantalla pequeña, nuestra barra de desplazamiento mostrará una pequeña cantidad de elementos a la vez.
Solución propuesta:
Deje que esas vistas adicionales se desplacen junto con los elementos de desplazamiento.
¿Cómo aplicarlo?
La solución más conveniente para lograr eso. Aparece en la vista de desplazamiento en sí. UICollectionView
por ejemplo, proporciona elementos adicionales (encabezados y pies de página) que se desplaza con los elementos de la vista de colección. Mueva su encabezado y tabbar al área del encabezado de UICollectionView
. luego, implemente viewForSupplementaryElementOfKind
en su controlador de vista:
- (nonnull UICollectionReusableView *)collectionView:(nonnull UICollectionView *)collectionView viewForSupplementaryElementOfKind:(nonnull NSString *)kind atIndexPath:(nonnull NSIndexPath *)indexPath
{
UICollectionReusableView *reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header1" forIndexPath:indexPath];
return reusableview;
}
Interface Builder: el área del encabezado para UICollectionView
ya existe. Sin embargo, debe establecer la altura a través del constructor de interfaz para aparecer en tiempo de diseño. No se olvide de configurar el identificador de vista reutilizable de la colección para el encabezado.
Nota: Esto también requiere un trabajo adicional para configurar los gestos en su encabezado y TabBar.
Actualizar:
Considere eliminar el encabezado y el contenedor de la barra de pestañas y volver a agregarlo como una subvista en su lugar apropiado en el tiempo de ejecución. Cuando se hace clic en la pestaña UICollectionView, páselo a la vista reutilizable del encabezado en el método viewForSupplementaryElementOfKind
. cuando se hace clic en una pestaña de etiquetas, agréguela encima de la vista del contenedor de etiquetas. y cuando se trata de una tabla, páselo al encabezado UITableView en el método headerForRow.