Search code examples
swiftuicollectionviewautolayoutuikituicollectionviewflowlayout

UIViewAlertForUnsatisfiableConstraints errors when working with dynamic header size UICollectionView


Intro

I am trying to give the header cell of my collectionView a dynamic cell sizing. The cell that is used as a header is also used as a "regular" cell in another collectionView. In there, working with a dynamic cell sizing works just fine.

This is how the collectionView is created:

private lazy var timelineCollectionView: UICollectionView = {
    let flowLayout = UICollectionViewFlowLayout()
    flowLayout.scrollDirection = .vertical
    flowLayout.estimatedItemSize = CGSize(width: self.view.frame.width, height: 10)
    flowLayout.minimumInteritemSpacing = 0
    flowLayout.minimumLineSpacing = 0
    
    let cv = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
    cv.alwaysBounceVertical = true
    cv.contentInsetAdjustmentBehavior = .never
    cv.backgroundColor = .clear
    cv.scrollIndicatorInsets = UIEdgeInsets(top: self.coloredTitleBarHeight - self.getStatusBarHeight(), left: 0, bottom: 0, right: 0)
    
    cv.delegate = self
    cv.dataSource = self
    cv.register(TLContentCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "content-header-cell")
    
    return cv
}()

I've followed this tutorial to work with a dynamic cell height.

Following the tutorial, this is a snippet of the code in my cell:

private lazy var width: NSLayoutConstraint = {
        let width = contentView.widthAnchor.constraint(equalToConstant: bounds.size.width)
        width.isActive = true
        return width
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.backgroundColor = UIColor.white
    }
    
    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
        width.constant = bounds.size.width
        return contentView.systemLayoutSizeFitting(CGSize(width: targetSize.width, height: 1))
    }

func setupViews() {
     // view setup happens here
     if let lastSubview = contentView.subviews.last {
         contentView.bottomAnchor.constraint(equalTo: lastSubview.bottomAnchor, constant: 0).isActive = true
     }
}

Again, this code works totally fine if I use the cell as a regular cell, not in a header or footer of the collectionView.

Now, I simply wanted to use it in a header. As it's not possible to provide something like an estimatedItemSize for a header cell, I'm using the following approach, found in this SO post:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        let indexPath = IndexPath(row: 0, section: section)
        let headerView = self.collectionView(collectionView, viewForSupplementaryElementOfKind: UICollectionView.elementKindSectionHeader, at: indexPath) as! TLContentCell
        headerView.layoutIfNeeded()
        
        return headerView.systemLayoutSizeFitting(CGSize(width: collectionView.frame.width, height: UIView.layoutFittingExpandedSize.height),
        withHorizontalFittingPriority: .required, // Width is fixed
        verticalFittingPriority: .fittingSizeLevel) // Height can be as large as needed
    }

And indeed, the header cell resizes correctly. However, UIKit prints a seemingly endless amount of UIViewAlertForUnsatisfiableConstraints errors (shortened due to the SO character limit):

    2020-01-16 15:29:00.427001+0100 MyApp[1542:65269] [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:0x600000024820 MyApp.DefaultLabel:0x7fa6fc579090'3d'.width == 17.6667   (active)>",
    "<NSLayoutConstraint:0x600000024780 MyApp.AnimatedButton:0x7fa6fc5786d0.width == 20   (active)>",
    "<NSLayoutConstraint:0x6000000245f0 UIImageView:0x7fa6fc578020.width == 45   (active)>",
    "<NSLayoutConstraint:0x600000024550 H:|-(0)-[UIImageView:0x7fa6fc578020](LTR)   (active, names: '|':UIView:0x7fa6fc578980 )>",
    "<NSLayoutConstraint:0x600000024730 MyApp.AnimatedButton:0x7fa6fc5786d0.right == UIView:0x7fa6fc578980.right   (active)>",
    "<NSLayoutConstraint:0x6000000247d0 MyApp.DefaultLabel:0x7fa6fc579090'3d'.right == MyApp.AnimatedButton:0x7fa6fc5786d0.left - 4   (active)>",
    "<NSLayoutConstraint:0x600000024a50 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'](LTR)   (active)>",
    "<NSLayoutConstraint:0x600000024910 MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'.right == MyApp.DefaultLabel:0x7fa6fc579090'3d'.left   (active)>",
    "<NSLayoutConstraint:0x600000024be0 H:|-(16)-[UIView:0x7fa6fc578980](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000024c30 UIView:0x7fa6fc578980.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000000245f0 UIImageView:0x7fa6fc578020.width == 45   (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.
2020-01-16 15:29:00.427892+0100 MyApp[1542:65269] [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:0x6000000252c0 UIStackView:0x7fa6fc57a470.width == 80   (active)>",
    "<NSLayoutConstraint:0x600000024fa0 H:|-(0)-[UIImageView:0x7fa6fc57a610](LTR)   (active, names: '|':UIView:0x7fa6fc57a300 )>",
    "<NSLayoutConstraint:0x600000025040 UIImageView:0x7fa6fc57a610.right == UIStackView:0x7fa6fc57a470.left - 8   (active)>",
    "<NSLayoutConstraint:0x600000025220 UIStackView:0x7fa6fc57a470.right == UIView:0x7fa6fc57a300.right   (active)>",
    "<NSLayoutConstraint:0x600000025360 H:|-(0)-[UIView:0x7fa6fc57a300](LTR)   (active, names: '|':UIView:0x7fa6fc57a010 )>",
    "<NSLayoutConstraint:0x6000000253b0 UIView:0x7fa6fc57a300.right == UIView:0x7fa6fc57a010.right   (active)>",
    "<NSLayoutConstraint:0x600000025590 H:|-(16)-[UIView:0x7fa6fc57a010](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x6000000255e0 UIView:0x7fa6fc57a010.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000000252c0 UIStackView:0x7fa6fc57a470.width == 80   (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.
2020-01-16 15:29:00.428596+0100 MyApp[1542:65269] [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:0x600000024820 MyApp.DefaultLabel:0x7fa6fc579090'3d'.width == 17.6667   (active)>",
    "<NSLayoutConstraint:0x600000024780 MyApp.AnimatedButton:0x7fa6fc5786d0.width == 20   (active)>",
    "<NSLayoutConstraint:0x600000024550 H:|-(0)-[UIImageView:0x7fa6fc578020](LTR)   (active, names: '|':UIView:0x7fa6fc578980 )>",
    "<NSLayoutConstraint:0x600000024730 MyApp.AnimatedButton:0x7fa6fc5786d0.right == UIView:0x7fa6fc578980.right   (active)>",
    "<NSLayoutConstraint:0x6000000247d0 MyApp.DefaultLabel:0x7fa6fc579090'3d'.right == MyApp.AnimatedButton:0x7fa6fc5786d0.left - 4   (active)>",
    "<NSLayoutConstraint:0x600000024a50 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'](LTR)   (active)>",
    "<NSLayoutConstraint:0x600000024910 MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'.right == MyApp.DefaultLabel:0x7fa6fc579090'3d'.left   (active)>",
    "<NSLayoutConstraint:0x600000024be0 H:|-(16)-[UIView:0x7fa6fc578980](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000024c30 UIView:0x7fa6fc578980.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000024780 MyApp.AnimatedButton:0x7fa6fc5786d0.width == 20   (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.
2020-01-16 15:29:00.429543+0100 MyApp[1542:65269] [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:0x600000024820 MyApp.DefaultLabel:0x7fa6fc579090'3d'.width == 17.6667   (active)>",
    "<NSLayoutConstraint:0x600000024550 H:|-(0)-[UIImageView:0x7fa6fc578020](LTR)   (active, names: '|':UIView:0x7fa6fc578980 )>",
    "<NSLayoutConstraint:0x600000024730 MyApp.AnimatedButton:0x7fa6fc5786d0.right == UIView:0x7fa6fc578980.right   (active)>",
    "<NSLayoutConstraint:0x6000000247d0 MyApp.DefaultLabel:0x7fa6fc579090'3d'.right == MyApp.AnimatedButton:0x7fa6fc5786d0.left - 4   (active)>",
    "<NSLayoutConstraint:0x600000024a50 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'](LTR)   (active)>",
    "<NSLayoutConstraint:0x600000024910 MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'.right == MyApp.DefaultLabel:0x7fa6fc579090'3d'.left   (active)>",
    "<NSLayoutConstraint:0x600000024be0 H:|-(16)-[UIView:0x7fa6fc578980](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000024c30 UIView:0x7fa6fc578980.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000024820 MyApp.DefaultLabel:0x7fa6fc579090'3d'.width == 17.6667   (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.
2020-01-16 15:29:00.430324+0100 MyApp[1542:65269] [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:0x6000000250e0 V:|-(0)-[UIStackView:0x7fa6fc57a470]   (active, names: '|':UIView:0x7fa6fc57a300 )>",
    "<NSLayoutConstraint:0x600000025090 UIStackView:0x7fa6fc57a470.bottom == UIView:0x7fa6fc57a300.bottom   (active)>",
    "<NSLayoutConstraint:0x600000025400 UIView:0x7fa6fc57a300.height == 0.5625*UIView:0x7fa6fc57a300.width   (active)>",
    "<NSLayoutConstraint:0x600000025360 H:|-(0)-[UIView:0x7fa6fc57a300](LTR)   (active, names: '|':UIView:0x7fa6fc57a010 )>",
    "<NSLayoutConstraint:0x6000000253b0 UIView:0x7fa6fc57a300.right == UIView:0x7fa6fc57a010.right   (active)>",
    "<NSLayoutConstraint:0x600000025590 H:|-(16)-[UIView:0x7fa6fc57a010](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x6000000255e0 UIView:0x7fa6fc57a010.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>",
    "<NSLayoutConstraint:0x600000026210 'UISV-canvas-connection' UIStackView:0x7fa6fc57a470.top == UIImageView:0x7fa6fc57a7e0.top   (active)>",
    "<NSLayoutConstraint:0x600000026260 'UISV-canvas-connection' V:[UIImageView:0x7fa6fc57ab80]-(0)-|   (active, names: '|':UIStackView:0x7fa6fc57a470 )>",
    "<NSLayoutConstraint:0x600000026300 'UISV-fill-equally' UIImageView:0x7fa6fc57a9b0.height == UIImageView:0x7fa6fc57a7e0.height   (active)>",
    "<NSLayoutConstraint:0x6000000263a0 'UISV-fill-equally' UIImageView:0x7fa6fc57ab80.height == UIImageView:0x7fa6fc57a7e0.height   (active)>",
    "<NSLayoutConstraint:0x6000000262b0 'UISV-spacing' V:[UIImageView:0x7fa6fc57a7e0]-(8)-[UIImageView:0x7fa6fc57a9b0]   (active)>",
    "<NSLayoutConstraint:0x600000026350 'UISV-spacing' V:[UIImageView:0x7fa6fc57a9b0]-(8)-[UIImageView:0x7fa6fc57ab80]   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000026350 'UISV-spacing' V:[UIImageView:0x7fa6fc57a9b0]-(8)-[UIImageView:0x7fa6fc57ab80]   (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.
2020-01-16 15:29:00.431297+0100 MyApp[1542:65269] [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:0x60000003df90 UIImageView:0x7fa6fc576970.width == 13   (active)>",
    "<NSLayoutConstraint:0x60000003e030 H:|-(4)-[UIImageView:0x7fa6fc576970](LTR)   (active, names: '|':UIView:0x7fa6fc56e2d0 )>",
    "<NSLayoutConstraint:0x60000003e940 H:[UIImageView:0x7fa6fc576970]-(4)-[MyApp.DefaultLabel:0x7fa6fc576700'by linus_hologram '](LTR)   (active)>",
    "<NSLayoutConstraint:0x60000003e440 MyApp.DefaultLabel:0x7fa6fc576700'by linus_hologram '.right == UIView:0x7fa6fc56e2d0.right - 4   (active)>",
    "<NSLayoutConstraint:0x6000000e2bc0 H:|-(16)-[UIView:0x7fa6fc56e2d0](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000023930 UIView:0x7fa6fc56e2d0.right <= UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000025ae0 MyApp.DefaultLabel:0x7fa6fc575060'0'.right == UIView:0x7fa6fc57c3e0.right   (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.
2020-01-16 15:29:00.434486+0100 MyApp[1542:65269] [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:0x60000003e030 H:|-(4)-[UIImageView:0x7fa6fc576970](LTR)   (active, names: '|':UIView:0x7fa6fc56e2d0 )>",
    "<NSLayoutConstraint:0x60000003e940 H:[UIImageView:0x7fa6fc576970]-(4)-[MyApp.DefaultLabel:0x7fa6fc576700'by linus_hologram '](LTR)   (active)>",
    "<NSLayoutConstraint:0x60000003e440 MyApp.DefaultLabel:0x7fa6fc576700'by linus_hologram '.right == UIView:0x7fa6fc56e2d0.right - 4   (active)>",
    "<NSLayoutConstraint:0x6000000e2bc0 H:|-(16)-[UIView:0x7fa6fc56e2d0](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000023930 UIView:0x7fa6fc56e2d0.right <= UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60000003e940 H:[UIImageView:0x7fa6fc576970]-(4)-[MyApp.DefaultLabel:0x7fa6fc576700'by linus_hologram '](LTR)   (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.
2020-01-16 15:29:00.435062+0100 MyApp[1542:65269] [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:0x600000024550 H:|-(0)-[UIImageView:0x7fa6fc578020](LTR)   (active, names: '|':UIView:0x7fa6fc578980 )>",
    "<NSLayoutConstraint:0x600000024730 MyApp.AnimatedButton:0x7fa6fc5786d0.right == UIView:0x7fa6fc578980.right   (active)>",
    "<NSLayoutConstraint:0x6000000247d0 MyApp.DefaultLabel:0x7fa6fc579090'3d'.right == MyApp.AnimatedButton:0x7fa6fc5786d0.left - 4   (active)>",
    "<NSLayoutConstraint:0x600000024a50 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'](LTR)   (active)>",
    "<NSLayoutConstraint:0x600000024910 MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'.right == MyApp.DefaultLabel:0x7fa6fc579090'3d'.left   (active)>",
    "<NSLayoutConstraint:0x600000024be0 H:|-(16)-[UIView:0x7fa6fc578980](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000024c30 UIView:0x7fa6fc578980.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000024a50 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc578460'@unitedholograms'](LTR)   (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.
2020-01-16 15:29:00.435727+0100 MyApp[1542:65269] [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:0x600000024550 H:|-(0)-[UIImageView:0x7fa6fc578020](LTR)   (active, names: '|':UIView:0x7fa6fc578980 )>",
    "<NSLayoutConstraint:0x600000024730 MyApp.AnimatedButton:0x7fa6fc5786d0.right == UIView:0x7fa6fc578980.right   (active)>",
    "<NSLayoutConstraint:0x6000000247d0 MyApp.DefaultLabel:0x7fa6fc579090'3d'.right == MyApp.AnimatedButton:0x7fa6fc5786d0.left - 4   (active)>",
    "<NSLayoutConstraint:0x600000024960 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc5781f0'MyApp'](LTR)   (active)>",
    "<NSLayoutConstraint:0x6000000249b0 MyApp.DefaultLabel:0x7fa6fc5781f0'MyApp'.right == MyApp.DefaultLabel:0x7fa6fc579090'3d'.left   (active)>",
    "<NSLayoutConstraint:0x600000024be0 H:|-(16)-[UIView:0x7fa6fc578980](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000024c30 UIView:0x7fa6fc578980.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000024960 H:[UIImageView:0x7fa6fc578020]-(8)-[MyApp.DefaultLabel:0x7fa6fc5781f0'MyApp'](LTR)   (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.
2020-01-16 15:29:00.436212+0100 MyApp[1542:65269] [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:0x600000024fa0 H:|-(0)-[UIImageView:0x7fa6fc57a610](LTR)   (active, names: '|':UIView:0x7fa6fc57a300 )>",
    "<NSLayoutConstraint:0x600000025040 UIImageView:0x7fa6fc57a610.right == UIStackView:0x7fa6fc57a470.left - 8   (active)>",
    "<NSLayoutConstraint:0x600000025220 UIStackView:0x7fa6fc57a470.right == UIView:0x7fa6fc57a300.right   (active)>",
    "<NSLayoutConstraint:0x600000025360 H:|-(0)-[UIView:0x7fa6fc57a300](LTR)   (active, names: '|':UIView:0x7fa6fc57a010 )>",
    "<NSLayoutConstraint:0x6000000253b0 UIView:0x7fa6fc57a300.right == UIView:0x7fa6fc57a010.right   (active)>",
    "<NSLayoutConstraint:0x600000025590 H:|-(16)-[UIView:0x7fa6fc57a010](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x6000000255e0 UIView:0x7fa6fc57a010.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000025220 UIStackView:0x7fa6fc57a470.right == UIView:0x7fa6fc57a300.right   (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.
2020-01-16 15:29:00.436954+0100 MyApp[1542:65269] [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:0x600000025680 H:|-(0)-[MyApp.PostInteractionButton:0x7fa6fc5720f0](LTR)   (active, names: '|':UIView:0x7fa6fc579e80 )>",
    "<NSLayoutConstraint:0x600000025720 MyApp.PostInteractionButton:0x7fa6fc5720f0.right == MyApp.DefaultLabel:0x7fa6fc573090'1'.left - 8   (active)>",
    "<NSLayoutConstraint:0x600000025810 MyApp.DefaultLabel:0x7fa6fc573090'1'.right == UIView:0x7fa6fc579e80.right   (active)>",
    "<NSLayoutConstraint:0x600000025ef0 H:|-(16)-[UIStackView:0x7fa6fc579cf0](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
    "<NSLayoutConstraint:0x600000025540 UIStackView:0x7fa6fc579cf0.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>",
    "<NSLayoutConstraint:0x6000000265d0 'UISV-canvas-connection' UIStackView:0x7fa6fc579cf0.leading == UIView:0x7fa6fc579e80.leading   (active)>",
    "<NSLayoutConstraint:0x600000026620 'UISV-canvas-connection' H:[MyApp.PostInteractionButton:0x7fa6fc5752d0]-(0)-|   (active, names: '|':UIStackView:0x7fa6fc579cf0 )>",
    "<NSLayoutConstraint:0x6000000266c0 'UISV-distributing-edge' H:[UIView:0x7fa6fc579e80]-(0)-[_UIOLAGapGuide:0x600001f8cd00'UISV-distributing']   (active)>",
    "<NSLayoutConstraint:0x600000026710 'UISV-distributing-edge' _UIOLAGapGuide:0x600001f8cd00'UISV-distributing'.trailing == UIView:0x7fa6fc57c3e0.leading   (active)>",
    "<NSLayoutConstraint:0x600000026800 'UISV-distributing-edge' H:[UIView:0x7fa6fc57c3e0]-(0)-[_UIOLAGapGuide:0x600001f8d300'UISV-distributing']   (active)>",
    "<NSLayoutConstraint:0x600000026850 'UISV-distributing-edge' _UIOLAGapGuide:0x600001f8d300'UISV-distributing'.trailing == UIView:0x7fa6fc57c6d0.leading   (active)>",
    "<NSLayoutConstraint:0x6000000267b0 'UISV-distributing-edge' H:[UIView:0x7fa6fc57c6d0]-(0)-[_UIOLAGapGuide:0x600001f8d400'UISV-distributing']   (active)>",
    "<NSLayoutConstraint:0x600000026940 'UISV-distributing-edge' _UIOLAGapGuide:0x600001f8d400'UISV-distributing'.trailing == MyApp.PostInteractionButton:0x7fa6fc5752d0.leading   (active)>",
    "<NSLayoutConstraint:0x6000000268a0 'UISV-fill-equally' _UIOLAGapGuide:0x600001f8d300'UISV-distributing'.width == _UIOLAGapGuide:0x600001f8cd00'UISV-distributing'.width   (active)>",
    "<NSLayoutConstraint:0x600000026990 'UISV-fill-equally' _UIOLAGapGuide:0x600001f8d400'UISV-distributing'.width == _UIOLAGapGuide:0x600001f8cd00'UISV-distributing'.width   (active)>"
)

Outro

I really have no idea why there's this behavior. Especially as everything works perfectly fine if I'm not using the cell as a header cell.


Solution

  • We can plug these errors into WTF Auto Layout? and get a better idea about what's going on.

    Let's start with the first one. The last 3 lines are interesting here:

    • View1's leading edge should equal View2's leading edge plus 16.
    • View1's trailing edge should equal View2's trailing edge minus 16.
    • View2's width should equal 0.

    However, it looks like the breaking constraint is the image view's width that is set to 45. UIImageView:0x7fa6fc578020.width == 45

    There's another constraint that pairs the imageView and View1 together: ImageView's leading edge should equal View1's leading edge.

    So with these details we can start forming a picture of how this is laid out.

    View2LeadingEdge - 16pts - View1LeadingEdge - ImageViewLeading - 45pts - ImageViewTrailing - View1TrailingEdge - 16pts - View2Trailing

    To me something seems off with View2's width being zero. Notice with each of the set of breaking constraints in the error, you see a line like:

    "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0 (active)>"

    I think I would need some more context to finish debugging but this should get you started on the right foot. I'm not sure exactly what View2 is but I would try to figure out why its width is getting set to zero.

    It doesn't seem like you forgot to disable the translatesAutoResizingMask or that the cell is adding this constraint automatically to enforce the layout, so if you can't figure it out, you can also try setting the priority on View1's trailing edge should equal View2's trailing edge minus 16. to .defaultHigh to see if that can help the autolayout engine determine the best layout.

    Don't forget to check this set out as well:

    (
        "<NSLayoutConstraint:0x600000025680 H:|-(0)-[MyApp.PostInteractionButton:0x7fa6fc5720f0](LTR)   (active, names: '|':UIView:0x7fa6fc579e80 )>",
        "<NSLayoutConstraint:0x600000025720 MyApp.PostInteractionButton:0x7fa6fc5720f0.right == MyApp.DefaultLabel:0x7fa6fc573090'1'.left - 8   (active)>",
        "<NSLayoutConstraint:0x600000025810 MyApp.DefaultLabel:0x7fa6fc573090'1'.right == UIView:0x7fa6fc579e80.right   (active)>",
        "<NSLayoutConstraint:0x600000025ef0 H:|-(16)-[UIStackView:0x7fa6fc579cf0](LTR)   (active, names: '|':UIView:0x7fa6fc56b450 )>",
        "<NSLayoutConstraint:0x600000025540 UIStackView:0x7fa6fc579cf0.right == UIView:0x7fa6fc56b450.right - 16   (active)>",
        "<NSLayoutConstraint:0x600000026fd0 UIView:0x7fa6fc56b450.width == 0   (active)>",
        "<NSLayoutConstraint:0x6000000265d0 'UISV-canvas-connection' UIStackView:0x7fa6fc579cf0.leading == UIView:0x7fa6fc579e80.leading   (active)>",
        "<NSLayoutConstraint:0x600000026620 'UISV-canvas-connection' H:[MyApp.PostInteractionButton:0x7fa6fc5752d0]-(0)-|   (active, names: '|':UIStackView:0x7fa6fc579cf0 )>",
        "<NSLayoutConstraint:0x6000000266c0 'UISV-distributing-edge' H:[UIView:0x7fa6fc579e80]-(0)-[_UIOLAGapGuide:0x600001f8cd00'UISV-distributing']   (active)>",
        "<NSLayoutConstraint:0x600000026710 'UISV-distributing-edge' _UIOLAGapGuide:0x600001f8cd00'UISV-distributing'.trailing == UIView:0x7fa6fc57c3e0.leading   (active)>",
        "<NSLayoutConstraint:0x600000026800 'UISV-distributing-edge' H:[UIView:0x7fa6fc57c3e0]-(0)-[_UIOLAGapGuide:0x600001f8d300'UISV-distributing']   (active)>",
        "<NSLayoutConstraint:0x600000026850 'UISV-distributing-edge' _UIOLAGapGuide:0x600001f8d300'UISV-distributing'.trailing == UIView:0x7fa6fc57c6d0.leading   (active)>",
        "<NSLayoutConstraint:0x6000000267b0 'UISV-distributing-edge' H:[UIView:0x7fa6fc57c6d0]-(0)-[_UIOLAGapGuide:0x600001f8d400'UISV-distributing']   (active)>",
        "<NSLayoutConstraint:0x600000026940 'UISV-distributing-edge' _UIOLAGapGuide:0x600001f8d400'UISV-distributing'.trailing == MyApp.PostInteractionButton:0x7fa6fc5752d0.leading   (active)>",
        "<NSLayoutConstraint:0x6000000268a0 'UISV-fill-equally' _UIOLAGapGuide:0x600001f8d300'UISV-distributing'.width == _UIOLAGapGuide:0x600001f8cd00'UISV-distributing'.width   (active)>",
        "<NSLayoutConstraint:0x600000026990 'UISV-fill-equally' _UIOLAGapGuide:0x600001f8d400'UISV-distributing'.width == _UIOLAGapGuide:0x600001f8cd00'UISV-distributing'.width   (active)>"
    )