在iOS 13上构建时,UITableViewCell selectedBackgroundView的颜色不可见

时间:2019-09-25 18:24:25

标签: uitableview ios13 xcode11

我在cellForRowAtIndexPath中通过选择为表格视图单元格添加了颜色

    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.grey3 //custom color
    cell.selectedBackgroundView = backgroundView

由于我使用Xcode 11.0构建,因此颜色不再在iOS 13设备或模拟器上传播到单元的子视图。如果我使用Xcode 11.0在iOS 12.2模拟器上构建,它仍然可以正常工作。

任何人都知道发生了什么变化才能导致这种行为?我正在处理.xib文件。

3 个答案:

答案 0 :(得分:1)

来自Apple的iOS 13 Release Notes

  

当单元格突出显示或选中时,UITableViewCell类不再更改contentView及其任何子视图的backgroundColor或isOpaque属性。如果要在contentView内部(包括其中)的单元格的任何子视图上设置不透明的backgroundColor,则当单元格突出显示或选中时的外观可能会受到影响。解决子视图问题的最简单方法是确保将其backgroundColor设置为nil或clear,并且其opaque属性为false。但是,如果需要,您可以覆盖setHighlighted(:animated :)和setSelected(:animated :)方法,以便在移入或移出突出显示和选定状态时手动更改子视图上的这些属性。

我的快速测试确认这是您的情况的原因。

带有绿色背景标签的单元格,橙色视图为.selectedBackgroundView

iOS 12:

enter image description here

iOS 13:

enter image description here

答案 1 :(得分:1)

我遇到了同样的问题,我的解决方法是:

TableViewController:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "testCell")! as! TestCell

    // Turn off selection style for iOS12, iOS11, etc...  
    cell.selectionStyle = .none

    return cell
}

单元格类(我在单元格的ContentView中有一个UIView):

class TestCell: UITableViewCell {

    @IBOutlet weak var testCellBackgroundView: UIView!

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

        if selected {
            contentView.backgroundColor = UIColor.white
            testCellBackgroundView.backgroundColor = UIColor.red
        } else { 
            contentView.backgroundColor = UIColor.white
            testCellBackgroundView.backgroundColor = UIColor.green // default background color
        }
    }

    // You may change highlighted color of a cell the same way
    override func setHighlighted(_ highlighted: Bool, animated: Bool) {
        super.setHighlighted(highlighted, animated: animated)

        if highlighted {
            contentView.backgroundColor = UIColor.white
            testCellBackgroundView.backgroundColor = UIColor.red
        } else {
            contentView.backgroundColor = UIColor.white
            testCellBackgroundView.backgroundColor = UIColor.green
        }
    }   
}

注意:这是我在stackoverflow上的第一个答案,请检查是否正确。

答案 2 :(得分:0)

如果使用层次结构调试器,则会看到在iOS 13中contentView位于backgroundViewselectedBackgroundView上方。

可以通过设置

来解决
contentView.backgroundColor = nil 

awakeFromNib

或设置contentView的{​​{1}}以在情节提要中清除