swift - 使用动态 header 大小 UICollectionView 时出现 UIViewAlertForUnsatisfiableConstraints 错误

标签 swift uicollectionview autolayout uikit uicollectionviewflowlayout

简介

我试图为我的 collectionView 的标题单元格提供动态单元格大小。用作标题的单元格也用作另一个 collectionView 中的“常规”单元格。在那里,使用动态单元格大小调整效果很好。

这就是collectionView的创建方式:

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
}()

我关注了this tutorial使用动态单元高度。

按照教程,这是我的单元格中的代码片段:

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
     }
}

同样,如果我将该单元格用作常规单元格,而不是在 collectionView 的页眉或页脚中,则此代码完全可以正常工作。

现在,我只是想在标题中使用它。由于无法为标题单元格提供诸如 estimatedItemSize 之类的内容,因此我使用了以下方法(可在 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
    }

确实,标题单元格大小调整正确。但是,UIKit 打印了看似无穷无尽的 UIViewAlertForUnsatisfiableConstraints 错误(由于 SO字符限制):

    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)>"
)

片尾

我真的不知道为什么会有这种行为。特别是如果我不使用单元格作为标题单元格,一切都工作得很好。

最佳答案

我们可以将这些错误插入 WTF Auto Layout?并更好地了解正在发生的事情。

让我们从 first one 开始。最后 3 行很有趣:

  • View1 的前缘应等于 View2 的前缘加 16。
  • View1 的后沿应等于 View2 的后沿减去 16。
  • View2 的宽度应等于 0。

但是,看起来破坏性约束是 ImageView 的宽度设置为 45。 UIImageView:0x7fa6fc578020.width == 45

还有另一个约束将 imageView 和 View1 配对在一起:ImageView's leading edge should equal View1's leading edge.

因此,有了这些详细信息,我们就可以开始了解其布局方式。

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

对我来说,View2 的宽度为零似乎有些不对劲。请注意,对于错误中的每组破坏约束,您都会看到类似以下的行:

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

我想我需要更多的上下文来完成调试,但这应该会让你有一个好的开始。我不确定 View2 到底是什么,但我会尝试找出为什么它的宽度设置为零。

您似乎没有忘记禁用translatesAutoResizingMask,或者单元格会自动添加此约束以强制执行布局,因此如果您无法弄清楚,您也可以尝试将优先级设置为View1's trailing edge should equal View2's trailing edge minus 16.到 .defaultHigh 看看是否可以帮助自动布局引擎确定最佳布局。

不要忘记检查此设置:

(
    "<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)>"
)

关于swift - 使用动态 header 大小 UICollectionView 时出现 UIViewAlertForUnsatisfiableConstraints 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59772051/

相关文章:

ios - 自动布局不起作用?

ios - 调整图像大小以适合背景

swift - CALayer:如何调用绘制函数?

ios - ( swift )初始 View Controller 调用 TableView Controller 而不点击任何按钮

ios - 在 XCode 8.2/Swift 3.0 中更改状态栏样式(No "View controller-based status bar appearance")

ios - 在 UIcollectionview 中出列多个单元格的方法

ios - 使用 UICollectionView 滚动 UICollectionView 背景

ios - 约束 UIImageView 高度以尊重 UITableViewCell 中的动态 UILabel 高度

swift - UICollectionView 未在 UITableViewCell 内部更新

ios - UILabel 上的 SizeToFit 和自动布局