uitableviewcell inside ios objective-c uicollectionview uicollectionviewcell uicollectionviewdelegate

ios - inside - Cambiar fondo de UICollectionView Cell on Tap



uicollectionview inside uitableviewcell (4)

Aquí está mi solución. Y estoy seguro de que realmente funciona.
Proporciono tres métodos para resaltar una celda (selectedBackgroundView, cell.contentView y cell.contentView un área especial).

Cómo utilizar:
1. simplemente heredar BaseCollectionViewCell y no hacer nada;
2. hereda y establezca specialHighlightedArea = UIView() y contentView.addSubView(specialHighlightedArea) , luego contentView.addSubView(specialHighlightedArea) o agregue restricciones para usar Auto Layout;
3. Si no necesita un efecto de resaltado, simplemente escriba un método llamado ''debería resaltarItemAtIndexPath'' definido por UICollectionViewDelegate y haga que devuelva false, o configure cell.shouldTintBackgroundWhenSelected = false y establezca specialHighlightedArea = nil y elimínelo de superView.

/// same with UITableViewCell''s selected backgroundColor private let highlightedColor = UIColor(rgb: 0xD8D8D8) /// you can make all your collectionViewCell inherit BaseCollectionViewCell class BaseCollectionViewCell: UICollectionViewCell { /// change it as you wish when or after initializing var shouldTintBackgroundWhenSelected = true /// you can give a special view when selected var specialHighlightedArea: UIView? // make lightgray background display immediately(使灰背景立即出现) override var isHighlighted: Bool { willSet { onSelected(newValue) } } // keep lightGray background until unselected (保留灰背景) override var isSelected: Bool { willSet { onSelected(newValue) } } func onSelected(_ newValue: Bool) { guard selectedBackgroundView == nil else { return } if shouldTintBackgroundWhenSelected { contentView.backgroundColor = newValue ? highlightedColor : UIColor.clear } if let area = specialHighlightedArea { area.backgroundColor = newValue ? UIColor.black.withAlphaComponent(0.4) : UIColor.clear } } } extension UIColor { convenience init(rgb: Int, alpha: CGFloat = 1.0) { self.init(red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgb & 0xFF00) >> 8) / 255.0, blue: CGFloat(rgb & 0xFF) / 255.0, alpha: alpha) } }

Tengo un UICollectionView que he creado programáticamente. Me gustaría que la vista de colección se comporte de la siguiente manera:

1. User touches cell 2. Cell background color changes 3. User releases touch 4. Cell background color changes

Este debe ser un cambio rápido de color que ocurre justo antes de que se ejecute el selector relacionado con la acción de toque en el que el controlador de vista que contiene la vista de colección se extrae de la pila.

He estado mirando esta pregunta: UICollectionView cambio de celda de fondo mientras toca

en el que se encuentra el siguiente resumen de métodos a utilizar para este propósito:

// Methods for notification of selection/deselection and highlight/unhighlight events. // The sequence of calls leading to selection from a user touch is: // // (when the touch begins) // 1. -collectionView:shouldHighlightItemAtIndexPath: // 2. -collectionView:didHighlightItemAtIndexPath: // // (when the touch lifts) // 3. -collectionView:shouldSelectItemAtIndexPath: or - collectionView:shouldDeselectItemAtIndexPath: // 4. -collectionView:didSelectItemAtIndexPath: or -collectionView:didDeselectItemAtIndexPath: // 5. -collectionView:didUnhighlightItemAtIndexPath:

Supongo que solo necesito implementar uno de los métodos anteriores desde ''cuando comienza el toque'' y ''cuando termina el toque''. Pero no importa lo que haga, parece que un color de fondo cambia y luego permanece cambiado. Aquí hay un ejemplo de algo que intenté y que no funcionó:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { //pop vc } - (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor redColor]; } - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor greenColor]; }

Esto hace que el color de fondo de la celda se cambie solo a rojo. También observé esta pregunta: UICollectionView Seleccione y deseleccione el problema e intenté implementar [UICollectionView selectItemAtIndexPath: animated: scrollPosition:] y llamándolo dentro de didSelectItemAtIndexPath, pero esto tampoco funcionó. Se establecen el origen de datos de vista de colección y el delegado.


El problema es que está cambiando el color al resaltar y volviéndolo a cambiar al anular la selección en lugar de al resaltar

Simplemente debes cambiar esto:

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor greenColor]; }

a esto:

- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor greenColor]; }

Además, si no desea esperar un poco antes de que se produzca su resaltado, debe establecer la propiedad delaysContentTouches de la vista de colección en NO

Editar: también asegúrese de que llame

[collectionView deselectItemAtIndexPath:indexPath animated:NO];

dentro del método -didSelectItemAtIndexPath


Editar: Respuesta en Swift 3

var selectedIndex = Int () func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell if selectedIndex == indexPath.row { cell.backgroundColor = UIColor.green } else { cell.backgroundColor = UIColor.red } return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { selectedIndex = indexPath.row self.yourCollctionView.reloadData() }


Versión Swift 3

Agregue los siguientes dos métodos a su clase de controlador de vista:

// change background color when user touches cell func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) { let cell = collectionView.cellForItem(at: indexPath) cell?.backgroundColor = UIColor.red } // change background color back when user releases touch func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) { let cell = collectionView.cellForItem(at: indexPath) cell?.backgroundColor = UIColor.green }

Consulte here para obtener ayuda para configurar una vista de colección básica en Swift.