UITableViewCell selectedBackgroundView's color not visible when building on iOS 13

后端 未结 3 422
旧巷少年郎
旧巷少年郎 2021-01-05 03:17

I have given a tableview cell a color on selection in cellForRowAtIndexPath using

    let backgroundView = UIView()
    backgroundView.backgroun         


        
相关标签:
3条回答
  • 2021-01-05 03:56

    From Apple's iOS 13 Release Notes:

    The UITableViewCell class no longer changes the backgroundColor or isOpaque properties of the contentView and any of its subviews when cells become highlighted or selected. If you are setting an opaque backgroundColor on any subviews of the cell inside (and including) the contentView, the appearance when the cell becomes highlighted or selected might be affected. The simplest way to resolve any issues with your subviews is to ensure their backgroundColor is set to nil or clear, and their opaque property is false. However, if needed you can override the setHighlighted(:animated:) and setSelected(:animated:) methods to manually change these properties on your subviews when moving to or from the highlighted and selected states.

    My quick test confirms this would be the cause in your case.

    Cell with green-background label, orange view as .selectedBackgroundView.

    iOS 12:

    iOS 13:

    0 讨论(0)
  • 2021-01-05 04:06

    If you use the hierarchy debugger, you'll see that in iOS 13 the contentView sits above the backgroundView and selectedBackgroundView.

    This can be resolved by setting

    contentView.backgroundColor = nil 
    

    in awakeFromNib

    or setting the contentView's backgroundColour to clear in the storyboard

    0 讨论(0)
  • 2021-01-05 04:08

    I had the same problem, my solutions is:

    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
    }
    

    Cell Class (I have a UIView inside cell's ContentView):

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

    Note: this is my first answer at stackoverflow, please check if it's correct.

    0 讨论(0)
提交回复
热议问题