ios uicollectionview uicollectionviewlayout contentoffset

ios - UICollectionView contentOffset cambia con diseño personalizado



uicollectionviewlayout (3)

Comencé a encontrar este problema apareciendo en iOS 11 donde tenía una vista de desplazamiento dentro de una vista de desplazamiento. Me tomó casi un día para averiguarlo.

Intente configurar el comportamiento de ajuste de inserción de contenido:

if #available(iOS 11.0, *) { scrollView.contentInsetAdjustmentBehavior = .never }

Esto arregló mi vista de colección ajustando su contenido insertado en una pequeña cantidad, ya que el marco de la vista de colección se movería más allá del área segura de la vista de desplazamiento adjunta.

Tengo un UICollectionView con un UICollectionViewLayout personalizado (en realidad, estoy usando este bonito diseño ).

Configuré contentOffset = CGPointZero en viewDidLoad. Sin embargo, después de viewDidLoad, el desplazamiento es -20, y el contenido se empuja hacia abajo así:

(Debe quedar al ras con la línea). Estoy cargando el diseño de vista de colección en el constructor de interfaces. Parece que mi problema es muy similar a este , sin embargo las soluciones no funcionan para mí.

Intenté modificar collectionViewContentSize en mi implementación de diseño para asegurarme de que siempre fuera mayor que el tamaño de collectionView. Aunque esto significa que puedo desplazar mi contenido hacia abajo (es más corto que la altura de la colección Vista) y ocultar el espacio extra, también puedo desplazarme hacia atrás para verlo.

¡Nada parece funcionar!


He encontrado la razón por la que esto sucede. Verifique la respuesta aceptada de esta pregunta: la barra de estado y la barra de navegación aparecen sobre los límites de mi vista en iOS 7

De hecho, podríamos simplemente configurar edgesForExtendedLayout o edgesForExtendedLayout automaticallyAdjustsScrollViewInsets propiedades de UIViewController en IB (si usa Storyboard) de in viewDidLoad y solucionará nuestro problema.

Simplemente no olvide que la verificación de esta propiedad está disponible, ya que en iOS6 o anterior causará un bloqueo:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { self.automaticallyAdjustsScrollViewInsets = NO; }

¡Saludos!


La única solución que pude encontrar tenía un comportamiento apenas aceptable:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (self.collectionView.contentOffset.y < 0) { self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0); } }

Además de establecer la altura del contenido en fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight]) en collectionViewContentSize

Esto elimina el espacio sobre el encabezado de la sección, pero elimina el "rebote" de la parte superior. Una solución bastante subóptima, pero bastante aceptable.

Aceptaré una mejor respuesta si alguien tiene una, o si encuentro una, la actualizaré.