UITableViewCell多选的选定背景颜色

问题描述 投票:37回答:12
// 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

任何答案如何设置所选单元格的背景颜色?

ios uitableview swift selection selected
12个回答
8
投票

Swift 4.2

对于多个选择,您需要将UITableView属性allowsMultipleSelection设置为true。

myTableView.allowsMultipleSelection = true

如果您将UITableViewCell子类化,则在自定义单元类中重写setSelected(_ selected: Bool, animated: Bool)方法。

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

     if selected {
         contentView.backgroundColor = UIColor.green
     } else {
         contentView.backgroundColor = UIColor.blue
     }
 }

1
投票

通过添加具有您自己背景颜色的自定义视图,您可以在表视图中使用自定义选择样式。

    cell.selectionStyle = .none

在TableView的cellForRowAt方法中添加这3行代码。我在UIColor中使用了一个扩展来添加十六进制颜色。将此扩展代码放在任何类的末尾(类的主体外)。

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
}

0
投票

SWIFT 3/4

let customBGColorView = UIView() customBGColorView.backgroundColor = UIColor(hexString: "#FFF900") cellObj.selectedBackgroundView = customBGColorView 的解决方案,如果你设置其他样式,你会看到“混合”背景颜色与灰色或蓝色。

别忘了!当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) } } 时,CustomCell.selectionStyle = .none没有打电话。

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)

-1
投票

斯威夫特4

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
        }
    }
}

87
投票

所有上述答案都很好,但有点复杂,我喜欢。最简单的方法是在cellForRowAtIndexPath中放入一些代码。这样,您可以永远不必担心在取消选择单元格时更改颜色。

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
}

70
投票

这对我有用:

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

33
投票

斯威夫特3

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

斯威夫特2

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

13
投票

Kersnowski方法的问题在于,当重新绘制单元格时,选择/取消选择时所做的更改将会消失。所以我会将更改移动到单元格本身,这意味着这里需要子类化。例如:

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
        }
    }
}

在您的表视图委托中只需调用reload

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

更新了Swift 3+,感谢@Bogy


4
投票

您还可以在界面构建器中设置单元格qazxsw poi toqazxsw poi。与@AhmedLotfy相同的解决方案仅提供给IB。

selectionStyle


3
投票

.none有一个属性enter image description hereUITableViewCell

只需创建一个multipleSelectionBackgroundView定义您选择的https://developer.apple.com/documentation/uikit/uitableviewcell/1623226-selectedbackgroundview并将其分配给您的单元格UIView属性。


3
投票

对于Swift 3,4和5,您可以通过两种方式完成此操作。

1)class:UITableViewCell

.backgroundColor

要么

2)tableView cellForRowAt

.multipleSelectionBackgroundView

请记住,这将禁用didSelectCell功能,这意味着选择一个单元格不会触发该单元格的任何操作。


2
投票

斯威夫特3

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

    selectionStyle = .none
}
© www.soinside.com 2019 - 2024. All rights reserved.