何时在UITableViewCell子类中启动自定义视图?

时间:2014-12-10 10:00:44

标签: ios uitableview swift

我正在尝试子类化Cell,但我在init()中获得的帧大小不是我在heightForRowAtIndexPath中设置的帧大小。

class MyCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    initCell()
}
required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initCell()
}
override func awakeFromNib() {
    super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    println("ContentViewFrame IN SET SELECTED: \(self.contentView.frame)")
}

func initCell() {
    println("ContentViewFrame IN initCell: \(self.contentView.frame)")
}
}

我用tabelView注册它:

myTable.registerClass(MyCell.self, forCellReuseIdentifier: "awesomeCell")

使用它:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("conversationCell", forIndexPath: indexPath) as ConversationCell
    return cell
}

动态设置高度:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 100.0
}

这是一个控制台输出:

ContentViewFrame IN initCell: (0.0,0.0,320.0,44.0)
ContentViewFrame IN SET SELECTED: (0.0,0.0,320.0,99.5)
ContentViewFrame IN SET SELECTED: (0.0,0.0,320.0,99.5)

所以我希望初始化时单元格的高度为100.0。但它的高度为44.0,只有setSelected函数返回正确的高度。在单元初始化的哪个阶段,我应该定义我的自定义init,所以我可以使用由heightForRowAtIndexPath定义的高度的单元格?

1 个答案:

答案 0 :(得分:3)

将该功能放在layoutSubviews()中。你没有把功能放在那里,因为它是"布置子视图",而是因为它是在单元的生命周期中调用的函数,你可以保证单元的所有子视图都是事实上,它由super.layoutSubviews()的第一行排列,因此contentView.frame将被定义和准确。无法保证contentView.frame在init中准确无误。更改框架的可能位置是prepareForReuse(),因为在重新使用之前,您可以清理和自定义单元格。它看起来像这样:

override func layoutSubviews() {
    super.layoutSubviews()
    myFunction()
}