it-swarm.com.de

UITableViewCell Ausgewählte Hintergrundfarbe bei Mehrfachauswahl

// Doesn't work
cell.selectionStyle = .Blue
//Works when the selection is not multiple, if it's multiple with each selection the previous one disappear...
let cellBGView = UIView()
cellBGView.backgroundColor = UIColor(red: 0, green: 0, blue: 200, alpha: 0.4)
cell.selectedBackgroundView = cellBGView

Gibt es eine Antwort, wie Sie die Hintergrundfarbe der ausgewählten Zellen einstellen?

35
Bogdan Bogdanov

Das hat für mich funktioniert:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var selectedCell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
    selectedCell.contentView.backgroundColor = UIColor.redColor()
}

// if tableView is set in attribute inspector with selection to multiple Selection it should work.

// Just set it back in deselect 

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    var cellToDeSelect:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
    cellToDeSelect.contentView.backgroundColor = colorForCellUnselected
}


//colorForCellUnselected is just a var in my class
68
D Kersnowski

Alle obigen Antworten sind in Ordnung, aber ein bisschen zu komplex nach meinem Geschmack. Am einfachsten ist es, etwas Code in die cellForRowAtIndexPath zu schreiben. Auf diese Weise müssen Sie sich nie darum kümmern, die Farbe zu ändern, wenn die Zelle deaktiviert ist.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    /* this is where the magic happens, create a UIView and set its
       backgroundColor to what ever color you like then set the cell's
       selectedBackgroundView to your created View */

    let backgroundView = UIView()
    backgroundView.backgroundColor = YOUR_COLOR_HERE
    cell.selectedBackgroundView = backgroundView
    return cell
}
82
OverD

Swift 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath)
    cell.selectionStyle = .none
    return cell
}

Swift 2

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath)
     cell.selectionStyle = .None
     return cell
}
30
Ahmed Lotfy

Das Problem bei Kersnowskis Ansatz besteht darin, dass beim Neuzeichnen der Zelle die Änderungen, die vorgenommen werden, wenn sie ausgewählt/deaktiviert werden, verschwinden. Ich würde also die Änderungen in die Zelle selbst verschieben, was bedeutet, dass hier Unterklassen erforderlich sind. Zum Beispiel:

class ICComplaintCategoryCell: UITableViewCell {
    @IBOutlet var label_title: UILabel!
    @IBOutlet var label_checkmark: UILabel!

    override func layoutSubviews() {
        super.layoutSubviews()
        reload()
    }
    func reload() {
        if isSelected {
            contentView.backgroundColor = UIColor.red
        }
        else if isHighlighted{
            contentView.backgroundColor = UIColor.red
        }
        else {
            contentView.backgroundColor = UIColor.white
        }
    }
}

Und in Ihrer Tabellensicht rufen Sie einfach reload auf:

if let cell = self.table.cellForRowAtIndexPath(path) as? ICComplaintCategoryCell {
    cell.reload()
}

Für Swift 3+ aktualisiert, danke @Bogy

12
superarts.org

Sie können im Interface Builder auch selectionStyle der Zelle auf.none setzen. Dieselbe Lösung wie bei @AhmedLotfy, nur von IB.

 enter image description here

3
Despotovic

Für Swift 4 haben Sie zwei Möglichkeiten

1) Klasse: UITableViewCell

override func awakeFromNib() {
    super.awakeFromNib()
    //Costumize cell

    selectionStyle = .none
}

oder

2) tableView cellForRowAt

    cell.selectionStyle = .none
2
Doca

Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)!
     selectedCell.contentView.backgroundColor = UIColor.darkGray
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
     let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)!
     selectedCell.contentView.backgroundColor = UIColor.clear
}
2
Barath

UITableViewCell hat ein Attribut multipleSelectionBackgroundView. https://developer.Apple.com/documentation/uikit/uitableviewcell/1623226-selectedbackgroundview

Erstellen Sie einfach eine UIView, definieren Sie den .backgroundColor Ihrer Wahl und weisen Sie ihn Ihrem .multipleSelectionBackgroundView-Attribut zu.

1
SNudel

Durch Hinzufügen einer benutzerdefinierten Ansicht mit der eigenen Hintergrundfarbe können Sie einen benutzerdefinierten Auswahlstil in der Tabellendarstellung festlegen.

let customBGColorView = UIView()
customBGColorView.backgroundColor = UIColor(hexString: "#FFF900")
cellObj.selectedBackgroundView = customBGColorView

Fügen Sie diesen dreizeiligen Code in der cellForRowAt-Methode von TableView ..__ hinzu. Ich habe eine Erweiterung in UIColor verwendet, um Farbe mit Hexcode hinzuzufügen. Setzen Sie diesen Erweiterungscode am Ende einer Klasse (außerhalb des Klassenbereichs der Klasse).

extension UIColor {    
convenience init(hexString: String) {
    let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
    var int = UInt32()
    Scanner(string: hex).scanHexInt32(&int)
    let a, r, g, b: UInt32
    switch hex.characters.count {
    case 3: // RGB (12-bit)
        (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
    case 6: // RGB (24-bit)
        (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
    case 8: // ARGB (32-bit)
        (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
    default:
        (a, r, g, b) = (255, 0, 0, 0)
    }
    self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
  }
}
1
Mr. JD Agrawal

Swift 4.2

Bei Mehrfachauswahl müssen Sie die UITableView-Eigenschaft allowsMultipleSelection auf true setzen.

myTableView.allowsMultipleSelection = true

Wenn Sie die UITableViewCell -Unterklasse untergeordnet haben, überschreiben Sie die setSelected(_ selected: Bool, animated: Bool)-Methode in Ihrer benutzerdefinierten Zellklasse.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        contentView.backgroundColor = UIColor.green
    } else {
        contentView.backgroundColor = UIColor.blue
    }
}
1
Somoy Das Gupta

Swift 3/4

Lösung für CustomCell.selectionStyle = .none, wenn Sie einen anderen Stil als "gemischte" Hintergrundfarbe mit Grau oder Blau festlegen.

Und vergiss nicht! func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) hat nicht angerufen, als CustomCell.selectionStyle = .none.

extension MenuView: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cellType = menuItems[indexPath.row]
        let selectedCell = tableView.cellForRow(at: indexPath)!
            selectedCell.contentView.backgroundColor = cellType == .none ? .clear : AppDelegate.statusbar?.backgroundColor?.withAlphaComponent(0.15)

        menuItemDidTap?(menuItems[indexPath.row])

        UIView.animate(withDuration: 0.15) {
            selectedCell.contentView.backgroundColor = .clear
        }
    }
}
0
podkorytov