2016-09-05 76 views
0

我試圖將包含單個UIImageView的UITableViewCell放置在使用動態單元高度和AutoLayout(即tableView.rowHeight = UITableViewAutomaticDimension)的UITableView中。使用Autolayout在UITableViewCell中的單個UIImageView

我將顯示的圖像具有特定的比例(1000:667),但除圖像單元格外還有其他單元格。我已經爲這個單元格建立了我的約束邏輯,以尊重UIImageView的長寬比

因此,爲避免畸形或部分圖像未顯示(剪輯子視圖),寬高比約束應根據設備屏幕寬度確定單元的高度。

細胞建於有以下限制nib文件:

IB constraints

顯然這個作品,由於細胞的高度相應地設置上取決於所使用的設備(仿真器)上運行時。

問題是我得到了很多突破性約束錯誤日誌(如下)。任何想法爲什麼iOS /表查看抱怨這個約束?

關於顯示尊重寬高比的UITableViewCell的不同方法的建議也將被讚賞。

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:0x7ff5097a7910 UIImageView:0x7ff5097393a0.width == 1.49925*UIImageView:0x7ff5097393a0.height>", 
    "<NSLayoutConstraint:0x7ff509739550 V:|-(0)-[UIImageView:0x7ff5097393a0] (Names: '|':UITableViewCellContentView:0x7ff5097a8e10)>", 
    "<NSLayoutConstraint:0x7ff5097aa180 UIImageView:0x7ff5097393a0.centerY == UITableViewCellContentView:0x7ff5097a8e10.centerY>", 
    "<NSLayoutConstraint:0x7ff5097a8c70 H:|-(0)-[UIImageView:0x7ff5097393a0] (Names: '|':UITableViewCellContentView:0x7ff5097a8e10)>", 
    "<NSLayoutConstraint:0x7ff5097a8cc0 H:[UIImageView:0x7ff5097393a0]-(0)-| (Names: '|':UITableViewCellContentView:0x7ff5097a8e10)>", 
    "<NSLayoutConstraint:0x7ff5097b6440 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7ff5097a8e10(276)]>", 
    "<NSLayoutConstraint:0x7ff5097b4930 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7ff5097a8e10(414)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7ff5097a7910 UIImageView:0x7ff5097393a0.width == 1.49925*UIImageView:0x7ff5097393a0.height> 

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

我也嘗試了不同的約束方法,如更換'居中y以:Superview'的'平等寬度改爲:SuperView',結果相同。 – Fdo

+0

如果你想UIImageView高度被固定,那麼你只有頂部或底部約束。另外如果你有中心對齊和高度,那麼不需要頂部和底部約束。如果你想UIImageView寬度被修復,那麼你需要前導或尾隨約束。 – sschunara

+0

只需移除imageView的固定高度和寬度以及中心對齊。將解決這個問題。 –

回答

4

這一個導致b'cos你給不必要的自動佈局(高度,寬度和中心y)conflits。

例如。你給予了高度則頂部和底部,高度仍然是固定的,你給的頂部和底部對齊...這是不必要的...

enter image description here

你可以試試這個建議。

1)center y + Trailing + Leading + Height. 2)Top + Bottom + Trailing + Leading. 3)height + width + center y + Leading 和許多

我希望你明白......

0

對於自動佈局任何視圖,只需要滿足的事情是所有視圖都應該獲取寬度,高度和x和y位置。

現在從您的問題中可以看出,您提供的6個約束條件中,只有最後4個約束條件自足以完成要求,因此不需要前2個約束條件。只要刪除它們。所有的事情都會好的。

您看到的警告消息是由於您提供了超過2個的約束條件,因此係統會從中提取哪些約束。

1

FDO,你已經清楚地發佈日誌解釋了什麼錯誤在那裏:)

問題是什麼?

  1. 您在imageView上設置了寬高比。因此,imageView會嘗試調整分配圖像的大小,同時保持您指定的寬高比。因此,ImageView的高度和寬度可能會根據您分配的圖像而有所不同。

  2. 您已將imageView的尾部和前導空間約束應用於單元格的contentView。這意味着無論發生什麼情況,都希望圖像視圖覆蓋單元格的整個寬度。你與自己的約束衝突。剛纔你說imageView可以自由改變它的框架,現在你應該說它應該覆蓋整個單元格的寬度,甚至可能是好友嗎?

  3. 同樣,您將圖像視圖的頂部和底部約束應用於單元格的contentView。那麼爲什麼這不會破裂呢?因爲細胞高度是根據您傳遞給imageView的圖像動態計算的,因此很簡單。所以顯然,調整大小後的imageView大小將等於單元格的高度。所以細胞高度沒有問題。

如何解決?

  1. 簡單刪除尾隨和ImageView的領先空間限制到單元格的內容查看,而是應用上的ImageView,這將使imageViews x位置,以及不會與ImageView的寬度亂水平居中約束。因此,沒有任何限制休息,一切會像魅力

額外的忠告

當您指定的ImageView將有頂部和底部約束到細胞,這意味着ImageView的高度將永遠是內容視圖等於細胞的高度,dude是否認真說出imageView將處於細胞的垂直中心?因爲無論如何,您的imageView將覆蓋從上到下的整個單元格。從任何方面來看,它不會破壞任何東西,但會傳遞更多的限制而不是實際需要的,這不是最好的做法,因爲它可能會在將來導致其他後果。

希望它有幫助。

相關問題