2014-12-28 18 views
7

Sto usando la vista raccolta orizzontale per scorrere le date. La vista raccolta contiene 30 celle. Se seleziono la prima cella, per indicare la selezione, il colore di sfondo della cella è stato modificato in marrone dal colore rosso predefinito. Quindi, se seleziono un'altra cella, il colore della cella selezionato è diventato marrone da rosso. Ma la prima cella BGColor rimane la stessa (marrone). Come posso cambiare il colore predefinito facendo clic su un'altra cella?Cambiare il colore di sfondo della cella in UICollectionView in Swift

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath 
    indexPath: NSIndexPath) -> UICollectionViewCell { 

    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", 
    forIndexPath: indexPath) as myViewCell 

    cell.date_label.text = arr_date[indexPath.item] 

    } 

     func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath 
     indexPath: NSIndexPath) { 

     var cell = collectionView.cellForItemAtIndexPath(indexPath) as myViewCell 

     if(cell.selected) 
     { 
      cell.backgroundColor = UIColor.brownColor() 

     } 
     else 
     { 
      cell.backgroundColor = UIColor.redColor() 
     } 

    } 

risposta

1

Si potrebbe mantenere una copia dell'ultimo percorso indice selezionato, e poi nella vostra didSelectItemAtIndexPath confrontare i percorsi di indice per vedere se sono diversi. Se diverso, cambia i colori delle due celle in questi percorsi dell'indice come necessario e quindi copia il nuovo percorso dell'indice sul vecchio.


Modifica

Pensando a questo nuovo, questo dovrebbe essere fatto con i backgroundView e selectedBackgroundView proprietà delle cellule. Dopo aver deselezionato una cella, puoi fare quanto segue per consentire a iOS di gestire il cambiamento.

cell.backgroundView.backgroundColor = [UIColor redColor]; 
cell.selectedBackgroundView.backgroundColor = [UIColor brownColor]; 
+0

Grazie Andrew! Ma come posso mantenere il vecchio e nuovo Indexpath? –

+1

@ McDonal_11 uso le variabili membro classe –

+0

quando ho usato 'cell.selectedBackgroundView.backgroundColor' ottengo l'errore' errore fatale: trovato inatteso nil mentre scartando un valore Optional'. Devo prima creare questa vista se la cella esiste già? – zillaofthegods

13

È possibile utilizzare la funzione collectionView con il parametro didSelectItemAtIndexPath

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath 
    indexPath: NSIndexPath) { 

     let selectedCell:UICollectionViewCell = myCollectionView.cellForItemAtIndexPath(indexPath)! 
     selectedCell.contentView.backgroundColor = UIColor(red: 102/256, green: 255/256, blue: 255/256, alpha: 0.66) 
} 

Questo crea una costante per il UICollectionViewCell selezionato, allora basta cambiare il colore del fondo


E poi per tornare al colore originale quando è deselezionato, è necessario utilizzare la funzione collectionView con il parametro er didDeselectItemAtIndexPath

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { 
     let cellToDeselect:UICollectionViewCell = myCollectionView.cellForItemAtIndexPath(indexPath)! 
     cellToDeselect.contentView.backgroundColor = UIColor.clearColor() 
} 

E si cambia il colore a quello originale!


Per esempio qui è lo screenshot da questo codice in un filterApp

UICollectionView example

2
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() 
} 

Può essere pazzo, ma funziona bene per me ...!

Problemi correlati