2017-04-04 57 views
0

我有一個與tableViewCell元素(c - 均值約束):的UITableViewCell動力高度與多個動態元件

  • 標籤:固定c.height(不重要)
  • Label1的:多行,換行,C。高度> = 20
  • Label2的:多行,換行,c.height> = 16
  • ImageView的:aspectFit,c.height> = 100。出路高度
  • 標籤:固定c.height(不重要)

TableView中已設置estimatedH = 30和rowH =自動

壓縮/擁抱優先級沒有改變 - 缺省情況下,BCS的所有元素在cellForRow具有相同的優先權

我設置label1和label2文本(2行和3條線)。此外,我還爲完成imageView調用SDWebImage方法sd_setImage。在完成我設置ImageView的高度,根據式:

newHeight =(cell.newsImageView.bounds.width/image.size.width)* image.size.height

但作爲結果,我的標籤顯示最多2行文字,而imageView的高度不正確。在tableView重新加載(拉到刷新)或新的dequed單元格全部好,但可見 - 不好。

我試圖預取使用SDWebImagePrefetcher圖像,並在其完成重裝表,但是這並不能幫助

任何想法如何解決這個問題?

UPD 17年5月4日

以下是有關約束衝突日誌棧。也許它可以幫助分析問題。

(
"<NSLayoutConstraint:0x797a1ec0 V:[UILabel:0x7b06b990'22.03.2017 '(16)]>", 
"<NSLayoutConstraint:0x797c7250 V:[UIImageView:0x797e6560(214.2)]>", 
"<NSLayoutConstraint:0x797ca430 V:[UILabel:0x797c7900'\U0427\U0418\U0422\U0410\U0422\U0418 \U041d\U041e\U0412\U0418\U041d\U0423'(20)]>", 
"<NSLayoutConstraint:0x797d7ac0 V:|-(16)-[UILabel:0x7b06b990'22.03.2017 '] (Names: '|':UIView:0x7b0810d0)>", 
"<NSLayoutConstraint:0x797d2ac0 V:[UILabel:0x7b06b990'22.03.2017 ']-(0)-[UILabel:0x797c40a0'\U0406\U043d\U0444\U043e\U0440\U043c\U0430\U0446\U0456\U044f \U0434\U043b\U044f \U0430\U0431\U043e\U043d\U0435\U043d\U0442\U0456\U0432 ...']>", 
"<NSLayoutConstraint:0x797d2b80 V:[UILabel:0x797c40a0'\U0406\U043d\U0444\U043e\U0440\U043c\U0430\U0446\U0456\U044f \U0434\U043b\U044f \U0430\U0431\U043e\U043d\U0435\U043d\U0442\U0456\U0432 ...']-(0)-[UILabel:0x797c9090'\U0417 1 \U043a\U0432\U0456\U0442\U043d\U044f 2017 \U0440\U043e\U043a\U0443 \U043f\U0440\U043e\U0432...']>", 
"<NSLayoutConstraint:0x797d7c70 V:[UILabel:0x797c9090'\U0417 1 \U043a\U0432\U0456\U0442\U043d\U044f 2017 \U0440\U043e\U043a\U0443 \U043f\U0440\U043e\U0432...']-(10)-[UIImageView:0x797e6560]>", 
"<NSLayoutConstraint:0x797d7d00 V:[UIImageView:0x797e6560]-(10)-[UILabel:0x797c7900'\U0427\U0418\U0422\U0410\U0422\U0418 \U041d\U041e\U0412\U0418\U041d\U0423']>", 
"<NSLayoutConstraint:0x797d7d30 V:[UILabel:0x797c7900'\U0427\U0418\U0422\U0410\U0422\U0418 \U041d\U041e\U0412\U0418\U041d\U0423']-(10)-| (Names: '|':UIView:0x7b0810d0)>", 
"<NSLayoutConstraint:0x797d8160 V:[UIView:0x7b0810d0]-(5)-| (Names: '|':UITableViewCellContentView:0x7b151eb0)>", 
"<NSLayoutConstraint:0x797d8190 V:|-(5)-[UIView:0x7b0810d0] (Names: '|':UITableViewCellContentView:0x7b151eb0)>", 
"<NSLayoutConstraint:0x797dacb0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7b151eb0(274)]>" 

UPD:Sample project

回答

0

你設置estimatedH = 30,但你實際上有更多的內容

20 + 16 + 100 = 136這是遠遠超過你的估計

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 150 

如果你想更新特定的單元格下載您的數據,那麼之後你可以調用更新表視圖

self.tableview.beginUpdates() 
tableview.reloadRows(at: [indexPath], with:.bottom) 
self.tableview.endUpdates() 

reloadRows具有枚舉的選項,您可以訪問那些點符號,我選擇了.bottom但你可以從以往相匹配的枚舉選擇需要

更新:Sample Project

+0

estimatedHeight是將由約束計算將覆蓋一些預定義的值。我爲案件設置了30,當我沒有圖像,但只有文本值。 此外,我不能使用reloadRows或開始/ endUpdates內cellForRow bcs它將導致循環 P.S.只是爲了確保,我檢查了具有不同估計值的病例H:小於,等於和大於真實細胞高度的值 - 沒有區別 – Viktor

+0

我認爲您的問題與您的自定義單元格內的ImageView大小有關。或者在ImageView.image = UIImage之後設置圖像,您必須調用圖像視圖上的sizeToFit(),以便圖像視圖知道它的大小,您可以在標籤上執行此操作,並且它將修復它。 ImageView.sizeToFit() –

+0

'sizeToFit'沒有幫助 我試圖爲兩個標籤添加高度約束,並以編程方式設置它們的高度 - 所有與它們一致的,直到圖像加載完成並設置圖像高度 此複製僅適用於已插入單元格。所有好的重用。我將set-height邏輯替換爲'willDisplayCell'並在開始時調用'cell.setNeedLayout'和'cell.layoutIfNeeded',但這沒有幫助。 將約束衝突日誌添加到問題 – Viktor