在IB uitableviewcell中使用带有XIB的自定义视图,具有动态高度

时间:2016-11-22 14:23:16

标签: ios swift uitableview interface-builder

我有一个单元格,其中一个区域的内容可能与其他单元格不同,(而其他单元格属性是相同的) - 我认为由nib支持的自定义视图在这种情况下运行良好但是遇到了使用自定义视图与高度为动态的单元格的问题。

故事板:

enter image description here

这是一个带有UITableView的UIViewController和一个自定义的UITableViewCell,MessageTableViewCell,实现如下:

class MessageTableViewCell: UITableViewCell {

@IBOutlet weak var avatar: UIImageView!
@IBOutlet weak var initials: UILabel!
@IBOutlet weak var timestamp: UILabel!
@IBOutlet weak var messageView: UIView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

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

    // Configure the view for the selected state
}

}

在视图控制器的cellForRowAtIndexPath方法中,我尝试使用messageView中的帧(视图控制器上单元格中的白框)来实例化由xib支持的UIView。

自定义视图:

enter image description here

它的实施:

类MessageView:NibLoadingView {

@IBOutlet weak var message: UILabel!

}

NibLoadingView实现: (信用:https://stackoverflow.com/a/40051928/4096655

class NibLoadingView: UIView {

weak var view: UIView!

override init(frame: CGRect) {
    super.init(frame: frame)
    nibSetup()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    nibSetup()
}

private func nibSetup() {
    backgroundColor = .clear

    view = loadViewFromNib()
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.translatesAutoresizingMaskIntoConstraints = true

    addSubview(view)
}

private func loadViewFromNib() -> UIView {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
    let nibView = nib.instantiate(withOwner: self, options: nil).first as! UIView

    return nibView
}
}

行实现的单元格:

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

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as? MessageTableViewCell else {
        return UITableViewCell()
    }

    let frame = cell.messageView.frame
    let messageView = MessageView(frame: frame)
    messageView.message.text = messages[indexPath.row]
    cell.addSubview(messageView)

    return cell
}

结果:

enter image description here

简短的故事是我想在我通常认为不同的单元格之间分享一些共同的属性,并且我试图为彼此不同的单元格创建自定义视图,其中一些具有动态高度。谢谢阅读。

1 个答案:

答案 0 :(得分:1)

您无需创建自定义视图MessageView,而是需要在messageView中添加MessageView的内容,这是您在原型单元格MessageTableViewCell中添加的视图viewController并且不要忘记出口,并在messageView约束的前导,顶部,尾部和底部给出标签, 最后在你的viewController中,而不是调用tableView(_:heightForRowAt:)调用tableView(_:estimatedHeightForRowAt:) UITableViewDelegate方法。