在UITableViewCell的layoutSubviews添加视图、布局问题()

背景

在UITableViewCell中显示多个标签,直到标签放不下。但是cell的宽度在initWithStyle时无法获知,而又不想传进cell中,故在layoutSubviews中处理。

具体问题

点击在layoutSubviews中添加的元素,cell出现选中态,但是没有走didSelectRowAt方法。

class FCTableViewCell: UITableViewCell {
    let bgView = UIView()
    let orangeView = UIView()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        setupViews()
        setupConstraints()
    }
    
    func setupViews() {
        bgView.backgroundColor = .red
        contentView.addSubview(bgView)            orangeView.backgroundColor = .orange
    }
    
    func setupConstraints() {
        bgView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(20)
            make.leading.equalToSuperview().offset(30)
            make.bottom.equalToSuperview()
            make.width.equalTo(200)
        }
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
                // 在公司项目中点击orangeView,出现选中态,但不响应didSelectRowAt        // 该demo中,长按orangeView,出现选中态
        for view in bgView.subviews {
            view.removeFromSuperview()
        }
        bgView.addSubview(orangeView)

        orangeView.snp.makeConstraints { make in
            make.top.leading.bottom.equalToSuperview()
            make.width.equalTo(100)
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

在写这个代码时,心里其实是不放心的,但为了偷懒,就这么写了。

具体解决

cell中传入width,不在layoutSubviews操作视图及布局。

————————

背景

在UITableViewCell中显示多个标签,直到标签放不下。但是cell的宽度在initWithStyle时无法获知,而又不想传进cell中,故在layoutSubviews中处理。

具体问题

点击在layoutSubviews中添加的元素,cell出现选中态,但是没有走didSelectRowAt方法。

class FCTableViewCell: UITableViewCell {
    let bgView = UIView()
    let orangeView = UIView()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        setupViews()
        setupConstraints()
    }
    
    func setupViews() {
        bgView.backgroundColor = .red
        contentView.addSubview(bgView)            orangeView.backgroundColor = .orange
    }
    
    func setupConstraints() {
        bgView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(20)
            make.leading.equalToSuperview().offset(30)
            make.bottom.equalToSuperview()
            make.width.equalTo(200)
        }
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
                // 在公司项目中点击orangeView,出现选中态,但不响应didSelectRowAt        // 该demo中,长按orangeView,出现选中态
        for view in bgView.subviews {
            view.removeFromSuperview()
        }
        bgView.addSubview(orangeView)

        orangeView.snp.makeConstraints { make in
            make.top.leading.bottom.equalToSuperview()
            make.width.equalTo(100)
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

在写这个代码时,心里其实是不放心的,但为了偷懒,就这么写了。

具体解决

cell中传入width,不在layoutSubviews操作视图及布局。