Resizing UITableView to fit content

Swift
// Swift 5 and 4.2 solution without KVO, DispatchQueue, or setting constraints yourself.

// This solution is based on Gulz's answer.

// 1) Create a subclass of UITableView:

import UIKit

final class ContentSizedTableView: UITableView {
    override var contentSize:CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }
}
// 2) Add a UITableView to your layout and set constraints on all sides. Set the class of it to ContentSizedTableView.

// 3) You should see some errors, because Storyboard doesn't take our subclass' intrinsicContentSize into account. Fix this by opening the size inspector and overriding the intrinsicContentSize to a placeholder value. This is an override for design time. At runtime it will use the override in our ContentSizedTableView class


Source

Also in Swift: