ios - uicollectionview self sizing cells




UICollectionView solo llama a didSelectItemAtIndexPath si el usuario pulsa dos veces, no llamará cuando el usuario toque un solo toque (8)

Tengo un UICollectionView que es aproximadamente del tamaño de la pantalla. Las UICollectionViewCells que muestra son del mismo tamaño que collectionView. Cada celda tiene un UIImage que es del tamaño de la celda. La vista de colección tiene habilitada la función de búsqueda, por lo que básicamente se trata de una presentación de diapositivas de pantalla completa para que el usuario pueda deslizarse.

El problema es ese
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath solo se -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath si el usuario toca dos dedos en una celda o pulsa con un dedo y luego suelta. No parece tener el comportamiento predeterminado de selección de un solo toque. No hice ningún cambio en el reconocedor de gestos CollectionView, así que tengo problemas para encontrar una solución a este problema.


¿Estás seguro de que no estás anulando accidentalmente - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath ? "Seleccionar" frente a "deseleccionar" me ha hecho tropezar en el pasado con la finalización del código de Xcode.


En mi caso fue solo

self.collectionView.allowsSelection  =NO;

Yo tenía el código.

cambiando a

self.collectionView.allowsSelection  =YES;

arreglalo.


Me encontré con este problema en Swift 3 y xcode 8, tenía una vista y una vista de colección dentro de esto. La vista de colección tiene userInteractionEnabled en true, todavía no funcionaba. Solucionado este problema anulando shouldHighlightItemAt, no tengo ningún extra / implementación personalizada en este método, por lo que no anulé este método. Después de agregar el código siguiente, se llama al método didSelectItem.

func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }

Me encontré con este problema yo mismo. Originalmente tenía botones y etiquetas, luego refactoreé mi UI y convertí esos botones / etiquetas en celdas para un UICollectionView .

Finalmente me di cuenta de que los botones estaban consumiendo mis grifos. Sin pensarlo, simplemente moví mis botones originales a la celda y no los convertí en un UIImage recto. Había destruido los botones asociados a las acciones y solo estaba buscando la selección de celdas, así que me tomó un tiempo averiguarlo.

Estúpido y obvio en retrospectiva, pero me llevó un par de horas darme cuenta de lo que había hecho.


Recuerde agregar UICollectionViewDataSource, UICollectionViewDelegate a la clase


Si tiene una vista en la celda que obstruye la vista del contenido de las celdas que es intratable, entonces no podrá conectar la devolución de llamada del delegado para la celda.

Deshabilitará la interacción del usuario en la vista obstructiva en el NIB o en el código.

view.userInteractionEnabled = NO;


Solo agregue a la pregunta ya resuelta una situación más en la que el gesto del grifo podría no funcionar, ya que esto seguía atormentándome.

Si devuelve false dentro de collectionView:shouldHighlightItemAtIndexPath: , el gesto de tap no funcionará y no se collectionView:didSelectItemAtIndexPath: El valor de retorno predeterminado de este método delegado es true , por lo que no tendrá el problema si no lo implementa deliberadamente.


Solo estaba teniendo el mismo problema y resultó que había un UITapGestureRecognizer en la UIView contenía UICollectionView y que respondía en su lugar.

Eso explica por qué didSelectItemAtIndexPath funciona solo si el usuario toca con dos dedos o presiones largas con un dedo porque eso no UITapGestureRecognizer el UITapGestureRecognizer .

Por lo tanto, compruebe todo el UITapGestureRecognizer que obtuvo allí, no necesariamente en el UICollectionView directamente, pero podría estar en cualquier UIView que lo contenga.