2016-11-22 64 views
0

我有一个单元格,其内容可以与其他单元格不同(其他单元格属性相同) - 我认为自定义视图支持在这种情况下,笔尖可以很好地工作,但遇到了使用自定义视图的问题,其中高度是动态的单元格。在IB中使用XIB自定义视图uitableviewcell w /动态高度

故事板:

enter image description here

这里是一个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。

该自定义视图:

enter image description here

它的实现:

类消息查看: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

简短的故事,我想什么之间我通常会考虑不同的一些共同的特性细胞,并试图为不同的单元格部分创建自定义视图,其中一些具有动态高度。谢谢阅读。

回答

0

你并不需要创建一个自定义视图MessageView,而不是你需要添加的消息查看MessageView的内容是你在对的viewController原型细胞MessageTableViewCell添加的看法,不要忘了网点,并在messageView约束内给出标签顶部,顶部,尾部和底部, 最后在您的viewController而不是调用tableView(_:heightForRowAt:)调用tableView(_:estimatedHeightForRowAt:) UITableViewDelegate方法。

+0

问题是MessageView应该可以与其他视图互换。否则,我只需要在IB中完成我需要的每种不同类型的单元。 –

+0

@thefredelement好了,然后只需将正确的约束添加到MessageView中的标签,并调用tableView(_:estimatedHeightForRowAt:)',以便单元格高度动态增加。 –

相关问题