动态表格视图单元格,以编程方式更改子视图高度

时间:2015-09-17 04:40:25

标签: ios xcode swift uitableview autolayout

我有UITableViewCell个自定义视图单元格。 在这个视图单元格中,我有一个名为imgWrapper的简单UIView,其中我添加了约束,如下所示:

  • width = 50
  • 身高= 50
  • 导致superview = 20
  • top to superview = 20
  • bottom to superview = 20

那是那里唯一的限制因素。然后我将拥抱和压缩保留为默认值。

在我的代码中,我设置了这个:

  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是否为true / false并且确实发生了变化。
  • 我也尝试CGRect(x,y,width,height)但也没有工作。
  • 我知道我可以做heightForRowAtIndexPath但是我想做动画,我知道我们可以为标签做这样的事情(参见printscreen),这使得tableView知道高度而不定义它:

enter image description here

任何想法我做错了什么?

4 个答案:

答案 0 :(得分:2)

您需要将高度逻辑放入名为UITableViewDelegate的{​​{1}}方法中,如下所示:

tableView:heightForRowAtIndexPath

PS。我在Swift 2中写了这个,因此是override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return (true ? 100 : 50) + 2 * 20 } 关键字。

答案 1 :(得分:1)

委托方法“heightForRowAtIndexPath”将为您完成。您可以知道从indexPath.row返回高度的单元格索引,从而相应地返回高度。

if indexPath.row == 0
{
  return 70
}
else if indexPath.row == 1
{
  return 100
}

答案 2 :(得分:1)

添加

self.automaticallyAdjustsScrollViewInsets = false

在这两行之前

tableView.estimatedRowHeight = 50
tableView.cellHeight = UITableViewCellAutomaticDimension

答案 3 :(得分:0)

解决方案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
}