UICollectionView celular de desaparecer

Lo que está sucediendo

Actualmente tengo una aplicación que utiliza dos UICollectionViews dentro de un UITableView. De esta manera puedo crear un Pulso de Noticias aspecto de la aplicación. Mi problema con esto es que a veces el 6 y el 11 de fila desaparece por completo, dejando un espacio en blanco donde debería estar la celda. Yo no la realidad de la mente, si todas las células eran como este (y de esta manera yo podría asumir que no estaba haciendo las cosas correctamente), pero la cosa es, que sucede con aquellos específicos.

Mi teoría

El 6 y el 11 de filas son las que me aparece al iniciar el desplazamiento, así que por defecto soy capaz de ver a 5 células, y cuando hago el primer desplazamiento horizontal de la 6ª viene (espacio en blanco a veces).

Lo que he

De lo único que estoy haciendo en este momento es esta:

 [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

Sobre la viewDidLoad. Y en la creación de la célula:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];

    return cell;
}

Así que en mi desmerecer nada de fantasía pasando aquí. Yo, sin embargo, había algo mal en el origen de datos (un maniquí archivo JSON), pero a veces funciona ok y en la celda de muestra, así que supongo que desde que la parte está bien.

Así que mi «pregunta»: ¿alguien sabe qué está pasando? La verdad no me gusta decir que es un bug de iOS, pero no puedo pensar en otra cosa.


Edición 1.0

La parte sorprendente es que este método

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

Va de indexPath [0,4] a [0,6] sin calcular la [0,5]. Primera vez que veo esta sucediendo en iOS.


Edit 2.0

Me han cambiado la manera en que yo estoy creando las células, y en lugar de la cola estoy utilizando de la manera antigua:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];

Siendo el mismo triste resultado.

  • Tengo el mismo problema, pero las células que desaparecen terminan siendo prestados por debajo de la celda anterior! Muy extraña. He asumido que era un bug en iOS.
  • Algunas cosas están sucediendo. =/ Pero todavía un excelente controlador..
  • He clásico de la vista de cuadrícula creado utilizando la vista de colección. Tengo 3 celdas en una fila con pequeñas lagunas. Lo mismo sucede aquí, pero parece muy al azar. De tiempo en tiempo una célula se coloca en el 4º lugar en una fila y en la que se espera lugar no es nada.
InformationsquelleAutor Rui Peres | 2012-11-13

10 Kommentare

  1. 35

    Así que, ¿qué trabajo?

    1) Subclase UICollectionViewFlowLayout.

    2) Establecer el flowLayout de mi UICollectionView a mi nueva subclase.

    3) En el método init de la UICollectionViewFlowLayout subclase, establecer la orientación que desee:

    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    En mi caso es Horizontal.

    4) La parte importante:

    -(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
    {
       return YES;
    }

    En este momento, debo explicar un poco, pero sinceramente no tengo ni idea.

    • Echa un vistazo a este error: openradar.appspot.com/12433891 Podría ser lo que usted está encontrando?
    • Tengo que ser honesto Rob, las cosas extrañas que suceden cuando se utiliza UICollectionView, no estoy seguro si es o no relacionadas.
    • Has probado a tocar el violín con la célula de la anchura y la altura? Estoy teniendo el mismo problema de representación con un desplazamiento horizontal de la colección de la vista. Puedo obtener desapareciendo cuando las células de mi ancho de la celda es de 70 años y la altura es de 70. Si puedo mantener el ancho de la celda en la 70 y cambiar la altura de la celda a 69, se procesa correctamente. Puedo reproducir esta situación en todo momento.
    • después de hacer lo que hice en el shouldInvalidateLayoutForBoundsChange:funciona a la perfección.
    • Gracias @rob-mayoff! Yo estaba teniendo el mismo problema. Siempre aleatoria de los elementos en la primera columna de desaparecer después de desplazarse hacia abajo y luego hacia arriba otra vez. El uso de una de las subclases en openradar.appspot.com/12433891 fijo para mí.
    • Desafortunadamente, esto no funciona para mí, pero la solución que aquí se hizo -> stackoverflow.com/questions/12927027/… Si la salida de la rects en esa función, verás que se crea dos filas / columnas, de manera que usted tiene que filtrar a 1.
    • Ya esta resuelto mi accidente en layoutSubViews que sólo se produce en iOS 9 (iOS 10 & 11 están bien), gracias.

  2. 16

    Las respuestas de arriba no funciona para mí, pero después de la descarga de las imágenes, he sustituido el código
    [self.myCollectionView reloadData]
    con
    [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
    para actualizar la collectionview y muestra todas las células, puede intentarlo.

    • Estúpidamente, esto funcionó para mí también…¿qué está pasando con UICollectionView?
    • Probado otras soluciones anteriores, ninguno estaba trabajando (Swift 3), esta corregido el error. Extraño…
    • No puedo creer que realmente funcionó y añade animaciones para mí también.
    • A veces, algunas al azar de la célula desaparece demasiado :/
  3. 6

    Ninguna de las soluciones dadas por cualquier persona que me ayudó en mi diseño personalizado que necesitamos tener en nuestra aplicación.
    En lugar de eso, tenía que hacer esto: (Y sí, FUNCIONA!!!)

    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
        CGSize size = [self collectionViewContentSize];
        rect.size.height = size.height*2;
        NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect];
        return atrributes_Super;
    }

    Después de todo, UICollectionView sólo en busca de los atributos de los elementos que se muestran en la pantalla del rect.

    • Algo Similar ocurrió aquí. La implementación de mi layoutAttributesForElementsInRect era no devolver los atributos de la celda deseada, que a su vez estaba siendo establecido como .hidden = SÍ.
  4. 3

    De Rob punta sobre el error que me ayudó. El error indica que si la sección de inserciones y las células anchos y espaciado suman exactamente a la anchura de la pantalla, a continuación, la primera columna, a veces al azar dissappears y vuelve a aparecer para algunas células en algunos lugares. En lugar de la subclase o cambiar el ancho de celda, he cambiado la sección de los márgenes de la izquierda y la derecha en mi guión de 6 a 4 y que no he visto de nuevo el problema.

    • Yo no era capaz de solucionarlo mediante Rob solución. Pero estoy muy contento de que trabajó para el hombre.
  5. 2

    Como puedo ejecutar el mismo problema, de repente y pasó algún tiempo en averiguar una de las posibles razones de la célula desapareciendo durante el desplazamiento, voy a añadir mi respuesta así.

    Requisitos previos del problema:

    1. Tiene un UICollectionView instancia
    2. Tiene un UICollectionViewFlowLayoutSubclass

    El problema

    Células desaparecer de la Vista de Colección después de desplazarse a la de cierto punto.

    El origen del problema está en el mal de subclases de la UICollectionViewFlowLayout.

    Como se dijo explícitamente en documentación:

    Cada objeto de diseño debe implementar los siguientes métodos:

    - collectionViewContentSize
    - layoutAttributesForElements(in:)
    - layoutAttributesForItem(at:)
    - layoutAttributesForSupplementaryView(ofKind:at:) //(if your layout supports -supplementary views)
    -layoutAttributesForDecorationView(ofKind:at:) //(if your layout supports decoration views)
    - shouldInvalidateLayout(forBoundsChange:)

    Por confiar en UICollectionViewFlowLayout la aplicación de los métodos de arriba podemos perder de vista el hecho de que func layoutAttributesForElements(in rect: CGRect) y collectionViewContentSize generará mal contentSize (el tamaño que sería correcto si todas las células tienen itemSize tamaño y el tamaño del contenido sería correspondientes. Tan pronto como el desplazamiento offsetY será mayor que contentSize la altura de la celda se desaparecen.

    La solución

    La solución se encuentra en buen UICollectionViewFlowLayout subclases. Reemplazar todos los métodos que se es necesario reemplazar y todo funcionará correctamente.

  6. 1

    En mi caso (desplazamiento vertical, con células desapareciendo en la primera vista), las células fueron desapareciendo debido a la incorrecta estimación del tamaño. Parece, UICollectionView utiliza el tamaño estimado para calcular los elementos de la carga en la primera vista. Me gustaría establecer el tamaño estimado demasiado alto, lo que estaba causando mal los cálculos para el número de elementos a cargar en la primera pantalla.

    El momento en que me hizo la estimación de la altura de bits baja, todas las células aparecían correctamente.

  7. 0

    Para mí este tema parece estar relacionado con la forma en que hago mi collectionview adaptarse al abrir el teclado para impedir que el contenido se superpone.

    en mi calidad de observador para responder a KeyboardWillShow he tenido este:

    var userInfo = obj.UserInfo[UIKeyboard.FrameEndUserInfoKey];
    if (userInfo is NSValue value)
    {
        var rect = value.CGRectValue;
        var windowOffset = this.Superview.ConvertPointToView(this.Frame.Location, UIApplication.SharedApplication.KeyWindow);
        var newHeight = rect.Y - windowOffset.Y;
    
        this._controller.CollectionView.Frame = new CGRect(0, 0, this._controller.CollectionView.Frame.Width, newHeight);
    }

    Después de cambiar a este:

    var userInfo = obj.UserInfo[UIKeyboard.FrameBeginUserInfoKey];
    if (userInfo is NSValue value)
    {
        var rect = value.CGRectValue;
        UIEdgeInsets contentInsets = new UIEdgeInsets(0, 0, rect.Height, 0);
        this._controller.CollectionView.ContentInset = contentInsets;
        this._controller.CollectionView.ScrollIndicatorInsets = contentInsets;
    }

    La celda de la desaparición de la cuestión desapareció completamente. Esto es C# a partir de trabajar con xamarin, pero espero que ayude a alguien más.

  8. 0

    Nos encontramos en la desaparición de las células recientemente y se encontró que en lugar de saltar «oculto» de células que fueron accidentalmente la inserción de 0 x 0 tamaño de las células. El comportamiento resultante era muy confuso y no sugieren estos invisible células fueron el problema. Nos gustaría ver el tamaño correcto de las células y diseño, pero un par de la validez de las células constantemente le desaparecen después de desplazarse de encendido/apagado de la pantalla. No tengo idea de por qué la mezcla 0 tamaño de las células podría provocar este comportamiento, pero la eliminación de ellos se ha solucionado el problema. Esto no puede ser la causa de su problema, pero esto puede ser útil para los desarrolladores de la búsqueda de síntomas similares.

  9. 0

    Sólo se quedó en un tema donde todos UICollectionView las células fueron desapareciendo en desplazamiento.

    Esto sucedió porque yo había declarado

    extension UICollectionViewLayout {
        static let defaultLayout: UICollectionViewLayout {
            let layout = UICollectionViewFlowLayout()
            layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
            return layout
        }()
    }

    … el sentido de la misma disposición instancia había sido utilizada en múltiples UICollectionViews. Yo tenía el propósito de hacer que un calculada var. Espero que esto ayude a alguien que accidentalmente usando el mismo objeto de diseño en múltiples vistas de colección.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...