动态表格视图单元格,以编程方式更改子视图高度
Posted
技术标签:
【中文标题】动态表格视图单元格,以编程方式更改子视图高度【英文标题】:Dynamic table view cell, change of subview height programmatically 【发布时间】:2015-09-17 04:40:24 【问题描述】:我有一个带有自定义视图单元格的UITableViewCell
。
在这个视图单元格中,我有一个名为 imgWrapper 的简单 UIView
,我在其中添加了如下约束:
这些是那里唯一的限制。我把拥抱和压缩留给了默认的。
在我的代码中我设置了这个:
override func viewDidLoad()
super.viewDidLoad()
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 90
然后在我的 rowAtIndex...我有这个:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell: LogCustomCell = tableView.dequeueReusableCellWithIdentifier("logCustomCell", forIndexPath: indexPath) as! LogCustomCell
var imgWrapperHeight: CGFloat = log.big ? 100 : 50
cell.imgWrapperHeight.frame.size.height = imgWrapperHeight
return cell
一旦我编译并运行它。所有单元格的大小都相同。
注意事项:
我检查了 log.big 是否为真/假,并且确实发生了变化。 我也尝试过CGRect(x,y,width,height)
,但也没有成功。
我知道我可以做heightForRowAtIndexPath
,但我想做动画,我知道我们可以为标签做这样的事情(见打印屏幕),这使得 tableView 知道高度而不定义它:
知道我做错了什么吗?
【问题讨论】:
您必须删除高度约束或底部以查看约束,因为您的约束存在问题 【参考方案1】:您需要将您的身高逻辑放入名为tableView:heightForRowAtIndexPath
的UITableViewDelegate
方法中,如下所示:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return (true ? 100 : 50) + 2 * 20
PS。我在 Swift 2 中编写了这个,因此是 override
keyword。
【讨论】:
当你这样做时,我认为自动布局取代了这个:self.tableView.rowHeight = UITableViewAutomaticDimension
你的imgWrapperHeight
在单元格中是什么类型的?根据名称,我猜它是NSLayoutConstraint
,但它没有名为frame
的属性。所以我猜这是UIView
?你想实现什么样的动画?没有单元格开始,然后它们都以各自的高度从顶部开始动画?【参考方案2】:
委托方法“heightForRowAtIndexPath”将为您完成。您可以知道要从 indexPath.row 中返回高度的单元格索引,从而相应地返回高度。
即
if indexPath.row == 0
return 70
else if indexPath.row == 1
return 100
【讨论】:
当你这样做时,我认为自动布局取代了这个:self.tableView.rowHeight = UITableViewAutomaticDimension
【参考方案3】:
添加
self.automaticallyAdjustsScrollViewInsets = false
这两行之前
tableView.estimatedRowHeight = 50
tableView.cellHeight = UITableViewCellAutomaticDimension
【讨论】:
【参考方案4】:解决方案 1:
正如用户所说。您可以像这样在 UITableViewController 中设置行高:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return (true ? 100 : 50) + 2 * 20
解决方案 2:
在将确定单元格高度的元素上设置height
约束。然后在你的 VC 中为NSLayoutConstraint
创建一个出口
在设置单元格的内容时,您可以执行以下操作:
例如: @IBOutlet var imgWrapperHeightConstraint: NSLayoutConstraint!
...
override func tableView(tableView: UITableView, cellAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
imgWrapperHeightConstraint.constant = 50 // Or whatever value you want
【讨论】:
以上是关于动态表格视图单元格,以编程方式更改子视图高度的主要内容,如果未能解决你的问题,请参考以下文章