2017-01-10 51 views
0

所以在我的tableViewCell中,我有一個imageView,它對尾隨和領先超視圖有0點約束。頂部約束條件爲8,底部約束條件爲30到超級視角。然後我添加imageView的方面約束根據圖像與此代碼:我的約束破解日誌沒有任何意義,有人可以幫助我理解嗎?

override var image: UIImage? { 
     didSet { 
      if let image = image { 
       let aspect = image.size.width/image.size.height 
       aspectConstraint = NSLayoutConstraint(item: self, 
                 attribute: NSLayoutAttribute.width, 
                 relatedBy: NSLayoutRelation.equal, 
                 toItem: self, 
                 attribute: NSLayoutAttribute.height, 
                 multiplier: aspect, 
                 constant: 0.0) 
      } 
     } 
    } 

    internal var aspectConstraint : NSLayoutConstraint? { 
     didSet { 
      if oldValue != nil { 
       self.removeConstraint(oldValue!) 
      } 
      if aspectConstraint != nil { 
       self.addConstraint(aspectConstraint!) 
      } 
     } 
    } 

我的代碼是如何打破任何約束?他們無關海誓山盟

2017年1月10日21:15:18.502301金卡納[4538:65958] [LayoutConstraints] 無法同時滿足約束。以下列表中的約束中的至少一個 可能是您不想要的。嘗試 這:(1)看看每個約束,並試圖找出哪些你不期望; (2)找到添加了不需要的約束或約束的代碼並對其進行修復。 (

"<NSLayoutConstraint:0x78698d60 UILabel:0x7869e890'Identical twins play a mi...'.top == UITableViewCellContentView:0x7869e500.topMargin (active)>", 
"<NSLayoutConstraint:0x7869c930 V:[UILabel:0x79ba65a0'1h']-(8)-[Gymkhana.ThumbnailImageView:0x7869c340] (active)>", 
"<NSLayoutConstraint:0x786a9ef0 H:[Gymkhana.ThumbnailImageView:0x7869c340]-(0)-| (active, names: '|':UITableViewCellContentView:0x7869e500)>", 
"<NSLayoutConstraint:0x78689700 H:|-(0)-[Gymkhana.ThumbnailImageView:0x7869c340] (active, names: '|':UITableViewCellContentView:0x7869e500)>", 
"<NSLayoutConstraint:0x7869a1b0 V:[Gymkhana.ThumbnailImageView:0x7869c340]-(30)-| (active, names: '|':UITableViewCellContentView:0x7869e500)>", 
"<NSLayoutConstraint:0x7869ca10 V:[UILabel:0x7869e890'Identical twins play a mi...']-(8)-[UILabel:0x79ba65a0'1h'] (active)>", 
"<NSLayoutConstraint:0x798fb620 Gymkhana.ThumbnailImageView:0x7869c340.width == Gymkhana.ThumbnailImageView:0x7869c340.height (active)>", 
"<NSLayoutConstraint:0x79b85b80 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7869e500.height == 329 (active)>", 
"<NSLayoutConstraint:0x79b82b80 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7869e500.width == 320 (active)>") 

將嘗試打破約束

<NSLayoutConstraint:0x798fb620 
Gymkhana.ThumbnailImageView:0x7869c340.width==Gymkhana.ThumbnailImageView:0x7869c340.height (active)> 
恢復
+1

你可以包含約束的字符串和它破壞的約束嗎? –

+1

嘗試刪除底部約束。它仍然給你警告嗎? – Yannick

+0

@yannick刪除底部約束使我的表格視圖單元格縮小,圖像視圖不可查看 – samitarmum

回答

2

約束可以治療的自動版式嘗試計算4個參數的視圖時使用規則:X,Y(意思的座標左上角),寬度和高度,你在圖像視圖上放置了5個約束條件,除了特殊情況外,它們之間會有一些衝突

你提到的前4個約束已經給出爲AutoLayout計算足夠的信息來計算我提到的imageView的所有4個參數。然後,寬高比約束出現,幾乎肯定會與其他約束相沖突,除非您的先前已導致與您在約束中設置的截然相同的截面。

有2種方式,你可以解決這個問題:

  1. 如果你想設置爲ImageView的圖像上已經有你想要的長寬比:徹底清除縱橫比限制。改爲使用imageView的contentMode屬性。

  2. 如果你確實需要一個特定的寬高比到你的imageView,那麼你需要重新考慮你的其他4個約束,因爲很明顯,它們中的一些並不能準確表示你希望如何定位和調整imageView的大小。例如:也許你不需要前導和尾隨約束,你只是想讓imageView與它的超級視圖的左右兩側有相同的距離?然後刪除尾隨和前導約束,並添加「水平中心」約束。

+0

水平添加一箇中心並刪除跟蹤和引導約束使得我的圖像視圖綁定擴展爲大於包含它的單元格,使其在左側裁剪並且右邊。你有其他解決方案嗎? – samitarmum

+1

如同第1點:完全移除方面約束。將imageView的'contentMode'設置爲'UIViewContentModeScaleAspectFit' – johnyu

+0

我在第一個地方添加aspect約束的原因是這個問題:http:// stackoverflow。com/questions/26041820/auto-layout-get-uiimageview-height-to-calculate-cell-height-correctly。 – samitarmum

相關問題