簡體   English   中英

“無法同時滿足約束”與 UITableViewCell

[英]"Unable to simultaneously satisfy constraints" with UITableViewCell

我使用 Interface Builder 在UITableViewCell為我的 Xcode 13.0/Swift 5/iOS 13.5 應用程序創建了一個非常簡單的布局:

UIStackView (里面有 2 個UIViewUILabel )在頂部,一個UIView (里面有一個UIImageView )在它下面。

目前的確切限制是:

  • UIStackView : 10pts 領先,10pts 尾隨,0pts 頂部,10pts 到底部的UIView ,50pts 的高度
  • UIView : 20pts 前導,20pts 尾隨,10pts 底部,(從 UIStackView 頂部UIStackView ),高度=寬度
  • UIView內的UIImageView : 0pts 前導/尾隨/頂部/底部,將中心 x 對齊到 Superview (= UIView )

與關於 stackoverflow 上警告的其他問題相反,我不直接設置UITableViewCell的高度,而是希望它由其內容設置。 UIImageView的圖像在運行時設置並應保持其形狀,因此方形圖像應為方形,其他矩形圖像應水平居中(-> 左/右不可見條,如有必要)但不是垂直居中。

Xcode 不會抱怨缺少約束,但這種布局一直給我臭名昭著的“無法同時滿足約束”警告。

[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:0x600002d22d50 UIStackView:0x7fe4fa293330.height == 50   (active)>",
    "<NSLayoutConstraint:0x600002d22df0 UIView:0x7fe4fa29d1c0.height == UIView:0x7fe4fa29d1c0.width   (active)>",
    "<NSLayoutConstraint:0x600002d23070 V:|-(0)-[UIStackView:0x7fe4fa293330]   (active, names: '|':UITableViewCellContentView:0x7fe4fa2840f0 )>",
    "<NSLayoutConstraint:0x600002d23110 H:[UIView:0x7fe4fa29d1c0]-(20)-|   (active, names: '|':UITableViewCellContentView:0x7fe4fa2840f0 )>",
    "<NSLayoutConstraint:0x600002d23160 V:[UIStackView:0x7fe4fa293330]-(10)-[UIView:0x7fe4fa29d1c0]   (active)>",
    "<NSLayoutConstraint:0x600002d231b0 H:|-(20)-[UIView:0x7fe4fa29d1c0]   (active, names: '|':UITableViewCellContentView:0x7fe4fa2840f0 )>",
    "<NSLayoutConstraint:0x600002d23200 V:[UIView:0x7fe4fa29d1c0]-(10)-|   (active, names: '|':UITableViewCellContentView:0x7fe4fa2840f0 )>",
    "<NSLayoutConstraint:0x600002d36530 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fe4fa2840f0.height == 325.5   (active)>",
    "<NSLayoutConstraint:0x600002d364e0 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7fe4fa2840f0.width == 295   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600002d22df0 UIView:0x7fe4fa29d1c0.height == UIView:0x7fe4fa29d1c0.width   (active)>

我已經檢查過wtfautolayout.com但我能看到的唯一錯誤是高度:如果寬度是 295,那么高度應該正好是 50+10+295-40+10=325(UIStackView.height + 約束在-between + UIView.width - 前導/尾隨約束 + 底部約束),而不是 325.5。 其他一切對我來說都很好,所以我不確定為什么它會計算出錯誤的高度(如果這就是問題的話)。

我已經嘗試了幾件事:

  • 添加了UIStackView的固定高度(在一切看起來都很好之前沒有使用它並且它沒有抱怨它,但仍然收到警告)
  • UIView.width = UIImageView.height (1:1 縱橫比,而不是上面的那個)
  • UIImageView.width = UIImageView.height (1:1 縱橫比,而不是上面的那個)
  • 刪除了“中心 x”約束

沒有任何效果,我不斷收到約束警告,如果由於我更改了某些內容而沒有在縱向模式下顯示,那么一旦我切換到橫向模式,它就會出現。 如何在 IB/無代碼中解決此問題?

嘗試將 height=width 約束的優先級更改為High而不是Required

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM