UITableViewCell programmatical constrain issue

I I am creating UITableViewCell using programmatical constrains. The call has a cardView and a button. The cardView alone works fine. But once I add UIButton to there then I can see the error on the console.

Complete Code:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    private lazy var tableView: UITableView = {
        let view = UITableView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        view.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
        view.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        return view
    override func viewDidLoad() {
        tableView.register(Cell.self, forCellReuseIdentifier: "Cell")
        tableView.separatorStyle = .none
        tableView.delegate = self
        tableView.dataSource = self
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: Cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
        return cell
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected: \(indexPath.row)")
private final class Cell: UITableViewCell {
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.backgroundColor  = .clear
        self.selectionStyle = .none
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    private lazy var cardView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
            view.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 18),
            view.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 9),
            view.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -18),
            view.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -9),
            view.heightAnchor.constraint(equalToConstant: 60)
        view.layer.cornerRadius = 8
        view.layer.borderColor = UIColor.lightGray.withAlphaComponent(0.7).cgColor
        view.layer.borderWidth = 1.0
        return view
    private(set) lazy var buttonOptions: UIButton = {
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
            button.widthAnchor.constraint(equalToConstant: 22),
            button.heightAnchor.constraint(equalToConstant: 18),
            button.centerXAnchor.constraint(equalTo: self.cardView.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: self.cardView.centerYAnchor)
        button.backgroundColor = UIColor.lightGray.withAlphaComponent(0.6)
        button.setImage(UIImage(systemName: "ellipsis")!, for: .normal)
        button.imageView?.tintColor = UIColor.lightGray
        return button
    func configure() {
        self.cardView.backgroundColor = .white
        self.buttonOptions.isHidden = false


[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
    "<NSLayoutConstraint:0x6000005b7480 V:|-(9)-[UIView:0x7ff5ac9066e0]   (active, names: '|':UITableViewCellContentView:0x7ff5ac90d4d0 )>",
    "<NSLayoutConstraint:0x6000005b7520 UIView:0x7ff5ac9066e0.bottom == UITableViewCellContentView:0x7ff5ac90d4d0.bottom - 9   (active)>",
    "<NSLayoutConstraint:0x6000005b7570 UIView:0x7ff5ac9066e0.height == 60   (active)>",
    "<NSLayoutConstraint:0x60000059c3c0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7ff5ac90d4d0.height == 44   (active)>"

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000005b7570 UIView:0x7ff5ac9066e0.height == 60   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

In the cell config, If I comment self.buttonOptions.isHidden = false then I don't see any warnings. I am not sure what is the thing I am missing here, Please help me out to resolve this problem.


  • At first glance, there was a conflict between the default table view height (44) and the custom view height (60).

    Then I drop a break point at UIViewAlertForUnsatisfiableConstraints. So weird, it's on button.imageView. Which, in my opinion, has correct constraints. Comment out this line and it works like a charm.

    //button.imageView?.tintColor = UIColor.lightGray

    Conclusion: I think it's a system bug, theoretically, the system height (44) takes precedence, and its priority would be 1000. So, a workaround is to lower the priority of cardView. Then the warning was gone. i.e:

    var height = view.heightAnchor.constraint(equalToConstant: 60)
    height.priority = .init(999)
    height.isActive = true

    I hope this will be helpful for you.