Don Boots
Don Boots

Reputation: 2166

Can't get UITableViewAutomaticDimension to work properly

I have a fairly standard UITableView that populates via custom cell. That cell is simply an image and a label at the moment. I cannot, for the life of me, get it to resize on it's own.

When I include UITableViewAutomaticDimension, I lose the ability to populate my data in addition to incorrect layouts.

Without UITableViewAutomaticDimension, the data is displayed properly.

I am using SnapKit to handle constraints and Meteor/SwiftDDP to handle the data, but there is another UITableView in the project that seems to be working properly

ViewController

class CommentViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var commentTable:UITableView!
    var comments:MeteorCollection<Comment>!

    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        comments = MeteorCollection<Comment>(name: "comments")

        createView()

        Meteor.subscribe("postsComments", params: [["postId": self.source!.id!]]) {}
    }

    func createView() {
        let contentTableView = UITableView(frame: content.frame)
        content.addSubview(contentTableView)
        contentTableView.backgroundColor = UIColor.clearColor()
        self.commentTable = contentTableView
        contentTableView.delegate = self
        contentTableView.dataSource = self

        contentTableView.snp_makeConstraints { (make) -> Void in
          make.top.equalTo(content)
          make.left.equalTo(content)
          make.right.equalTo(content)
          make.height.equalTo(content).inset(65)
        }

        contentTableView.rowHeight = UITableViewAutomaticDimension
        contentTableView.estimatedRowHeight = 350

    }
}

CommentTableViewDelegate.swift

import UIKit

extension CommentViewController {
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.comments.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(CommentTableViewCell.reuseIdentifier, forIndexPath: indexPath) as UITableViewCell

        cell.setNeedsUpdateConstraints()
        cell.updateConstraintsIfNeeded()
        if let card = cell as? CommentTableViewCell {
            let item = self.comments.sorted[indexPath.row]
            card.populate(item)
        }

        return CommentTableViewCell()
    }

    func reloadTableView() {
        self.commentTable.reloadData()
    }
}

An example of my garbled mess when not using UITableViewAutomaticDimension enter image description here

An example of my garbled mess when using UITableViewAutomaticDimension enter image description here

Upvotes: 1

Views: 373

Answers (2)

Prema Janoti
Prema Janoti

Reputation: 856

It might be due to improper constraint within cell. Please add constraint properly in table view cell and set these two properties of UILable from Attributes inspector section of storyboard:

  • lines to 0
  • Line break to word wrap

or you can also set these properties from code:

 self.lblxyz.numberOfLines = 0
 self.lblxyz.lineBreakMode = .byWordWrapping

Note - Do not fix the height of UILable.

Hope it will help you... :)

Upvotes: 4

Aashish
Aashish

Reputation: 2696

I'm not sure if it works but, I've been through the same problem recently, and i fixed it by changing the estimatedRowHeight .

Can you please try once with:-

contentTableView.estimatedRowHeight = 350

to, contentTableView.estimatedRowHeight = 160

Upvotes: 1

Related Questions