为什么我的自定义UITableViewCell在调用self.frame.width时返回错误的宽度?

时间:2017-08-31 04:09:14

标签: ios swift uitableview

@Kevin的评论已经回答了这个问题。我没有打电话给layoutSubviews

所有内容都是以编程方式创建的。没有什么是通过故事板完成的。这是tableView代码的精简版本:

func configure(cell: UITableViewCell, for indexPath: IndexPath) {
    guard let cell = cell as? HistoryTableViewCell else {
        return
    }
// I set up the cells various properties here.
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: historyCellIdentifier, for: indexPath) as! HistoryTableViewCell
    configure(cell: cell, for: indexPath)

    return cell
} 

这是我的UITableViewCell的精简版:

class HistoryTableViewCell: UITableViewCell {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:)")
}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.backgroundColor = UIColor.blue

    let  test = UIView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: 10))
            test.backgroundColor = UIColor.black
            self.addSubview(test)    
}

override func prepareForReuse() {
    super.prepareForReuse()

    }
}

注意我将测试视图宽度设置为self.frame.width。产生这个: iphone 7+ screenshot

在HistoryTableViewCell中打印self.frame.width会产生320,这是iPhone 5s的宽度。知道为什么吗?我假设它是像我之前创建单元格所以它默认为最小尺寸。

另一件奇怪的事情是,如果我尝试将测试视图center.x设置为self.center.x,它会保留在我认为奇怪的地方,因为背景颜色显示单元格是屏幕的宽度。

由于

1 个答案:

答案 0 :(得分:0)

除非您不想使用autolayout或autoresizingmaske,否则请将UI组件作为属性并在layoutSubview中更新其框架。

class HistoryTableViewCell: UITableViewCell {

let test = UIView()

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:)")
}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.backgroundColor = UIColor.blue
    self.test.backgroundColor = UIColor.black
    self.contentView.addSubview(test)    
}

override func prepareForReuse() {
    super.prepareForReuse()

    }
}

override func layoutSubviews() {
    super.layoutSubviews()
    test.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 10)
}