2017-04-04 56 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