2016-11-22 10 views
0

コンテンツが他のセルと異なる場合があるセルを持っています(他のセルのプロパティは同じです)。この場合はペン先がうまくいくが、高さが動的なセルを持つカスタムビューを使用して問題にぶつかります。IBのuitableviewcellでカスタムビューを使用する動的な高さで

絵コンテ:

ここenter image description here

はこのように実装のUITableViewとカスタムUITableViewCellの、MessageTableViewCell、とのUIViewControllerです:View ControllerのcellForRowAtIndexPathメソッドで

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 
} 

} 

、私はにしようメッセージビュー(ビューコントローラのセルの白いボックス)からフレームを使用して、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 
} 
} 

行の実装のためのセルは:

enter image description here

ショートストーリーは、私は通常、異なる検討すると何の間にいくつかの共通の特性を共有したいです:中

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 
} 

結果相互に異なるセルの部分のカスタムビューを作成しようとしていますが、その中には動的な高さがあります。読んでくれてありがとう。

答えて

0

あなたが代わりにあなたは、あなたがのViewControllerのプロトタイプ細胞MessageTableViewCellに追加したビューであるmessageViewでMessageViewの内容を追加する必要があるとコンセントを忘れないでください、カスタムビューMessageViewを作成する必要はありませんし、 tableView(_:heightForRowAt:)を呼び出すのではなく、最後にviewControllerに の先頭、末尾、下端のmessageView制約内にラベルを付けます。tableView(_:estimatedHeightForRowAt:) UITableViewDelegateメソッドを呼び出します。

+0

重要な点は、MessageViewは他のビューと互換性があることです。それ以外の場合は、必要なセルの種類ごとにIBですべてを実行します。 –

+0

@thefredelement次に、正しい制約を 'MessageView'内のラベルに追加し、セルの高さが動的に増加するように' tableView(_:estimatedHeightForRowAt:) 'を呼び出します。 –

関連する問題