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
Update: Changed code for Swift 4.2. If you’re using a prior version, use UIViewNoIntrinsicMetric
instead of UIView.noIntrinsicMetric