在IB中使用XIB自定义视图uitableviewcell w /动态高度
我有一个单元格,其内容可以与其他单元格不同(其他单元格属性相同) - 我认为自定义视图支持在这种情况下,笔尖可以很好地工作,但遇到了使用自定义视图的问题,其中高度是动态的单元格。在IB中使用XIB自定义视图uitableviewcell w /动态高度
故事板:
这里是一个UITableView和一个自定义的UITableViewCell,MessageTableViewCell,这样实现的一个UIViewController:
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。
该自定义视图:
它的实现:
类消息查看: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
}
结果:
简短的故事,我想什么之间我通常会考虑不同的一些共同的特性细胞,并试图为不同的单元格部分创建自定义视图,其中一些具有动态高度。谢谢阅读。
你并不需要创建一个自定义视图MessageView
,而不是你需要添加的消息查看MessageView
的内容是你在对的viewController原型细胞MessageTableViewCell
添加的看法,不要忘了网点,并在messageView约束内给出标签顶部,顶部,尾部和底部, 最后在您的viewController而不是调用tableView(_:heightForRowAt:)
调用tableView(_:estimatedHeightForRowAt:)
UITableViewDelegate方法。
问题是MessageView应该可以与其他视图互换。否则,我只需要在IB中完成我需要的每种不同类型的单元。 –
@thefredelement好了,然后只需将正确的约束添加到MessageView中的标签,并调用tableView(_:estimatedHeightForRowAt:)',以便单元格高度动态增加。 –