it-swarm.com.de

Wie kann ich ausgewählte UICollectionView-Zellen markieren? (Schnell)

Ich habe eine UICollectionView und der Benutzer kann mehrere Zellen auswählen. Es ist etwas schwierig, den Überblick darüber zu behalten, welche Zellen ausgewählt wurden. Ich brauche also einen Weg, um einen Rand hervorzuheben, wenn die Zelle angetippt wird.

Code:

func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {

    addToList.append(objectsArray[indexPath.row])

    return true

}
17
bkwebhero

sie können den Rahmenwechsel für das didSelectItemAtIndexPath-Überschreibungsereignis wie im folgenden Code verwenden und der Zelle neue Einstellungen zuweisen.

Swift 3.x:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    addToList.append(objectsArray[indexPath.row])
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.layer.borderWidth = 2.0
    cell?.layer.borderColor = UIColor.gray.cgColor
}
41
Özgür Ersil

Hier ist meine Lösung und ich bin sicher, dass es funktioniert. 

Meine Lösung enthält 3 Hervorhebungseffekte, UICollectionCells selectedBackgroundView, cell.contentView.backgroundColor oder Ihre eigene specialHighlightedArea.

Wie benutzt man? Erben Sie einfach BaseCollectionViewCell. Falls erforderlich, konfigurieren Sie die Delegat-Methoden der Zelle in init oder collectionView.

Wenn Sie keinen Hervorhebungseffekt benötigen, suchen Sie einfach eine Methode mit dem Namen ' shouldHighlightItemAtIndexPath ' in UICollectionViewDelegate und geben Sie false zurück oder setzen Sie einfach cell.shouldTintBackgroundWhenSelected = false.

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)
    }
}
/// same with UITableViewCell's selected backgroundColor
private let highlightedColor = UIColor(rgb: 0xD8D8D8) 

class BaseCollectionViewCell: UICollectionViewCell {

    var shouldTintBackgroundWhenSelected = true // You can change default value
    var specialHighlightedArea: UIView?

    // make lightgray background show 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 ? cellHighlightedColor : UIColor.clear
        }
        if let sa = specialHighlightedArea {
            sa.backgroundColor = newValue ? UIColor.black.withAlphaComponent(0.4) : UIColor.clear
        }
    }
}
11
DawnSong

Sie können eine angepasste collcetionViewCell erstellen und überschreiben:

class MyCell: UICollectionViewCell {

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                print("yes")
                // Your customized animation or add a overlay view
            } else {
                print("no")
                // Your customized animation or remove overlay view
            }
        }
    }
}

Auf diese Weise können Sie ein ähnliches Ergebnis wie den Hervorhebungseffekt in UITableViewCell erstellen.

Ohne Unterklassen:

Wenn Sie keine eigene collectionViewCell erstellen möchten. Sie können die Delegat-Methode verwenden:

func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath)

func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath)

Sie können das Gleiche damit machen.

4
Strong

Benutzen 

collectionView.reloadItemsAtIndexPaths([indexPath])

um die aktuelle Zelle neu zu laden, oder 

collectionView.reloadData()

alle Zellen in shouldSelectItemAtIndexPath neu laden

Legen Sie dann in cellForItemAtIndexPath Ihre Rahmen- oder Hintergrundfarbe fest, wenn die Zelle als markiert markiert ist (Sie benötigen möglicherweise ein neues Array für markierte Zellen mit vorzugsweise Indexpfaden.

4
Sunkas

Swift

Fügen Sie diesen Code Ihrer UICollectionViewCell-Unterklasse hinzu:

 override var isSelected: Bool {
    didSet{
        if self.isSelected {
            self.backgroundColor = UIColor(r: 115, g: 190, b: 170)
        }
        else {
            self.backgroundColor = UIColor(r: 60, g: 63, b: 73)
        }
    }
}

Dadurch wird die Farbe einer einzelnen ausgewählten Zelle festgelegt und die ausgewählte Farbe aus allen zuvor ausgewählten Zellen entfernt.

0
drfalcoew

Für die Mehrfachauswahl einer Zelle können Sie dies wie folgt tun:

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){

    if let currentCell = collectionView.cellForItem(at: indexPath) as? QuestionnaireCollectionViewCell {

        // Your selection logic, you can change it according to your requirement
       if currentCell.selectedImage.isHidden == true{
           currentCell.selectedImage.isHidden = false

       }
       else{
          currentCell.selectedImage.isHidden = true
       }
    }

    }

}

Für die Einzelauswahl können Sie isSelected in Ihrer collectionviewcell-Klasse wie folgt verwenden:

 override var isSelected: Bool{
   didSet{
     if self.isSelected
     {
     //This block will be executed whenever the cell’s   selection state is set to true (i.e For the selected cell)
     }
    else
     {
     //This block will be executed whenever the cell’s selection state is set to false (i.e For the rest of the cells)
     }
   }
}
0
H S Progr

Versuchen Sie, die Ränder so dick zu machen, dass die gesamte Zelle bedeckt wird

Code: 

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    addToList.append(objectsArray[indexPath.row])
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.layer.borderWidth = 200.0
    cell?.layer.borderColor = UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.4).cgColor
}
0
Deepansh Jagga