未隐藏某些UIStackView的子视图时,UITableViewCell不会改变高度

时间:2018-09-21 09:50:19

标签: ios iphone swift uitableview uistackview

正如标题所述,我有一个自定义UITableCell,其中有一些UIStackViews。这些堆栈中的每个堆栈都包含许多子视图,但是我只想在首次显示该单元格时显示其中的三个。如果用户希望看到更多内容,可以使用[+]按钮来调用添加剩余部分的方法。

自定义单元格的高度是通过UITableViewAutomaticDimension确定的,它非常适合单元格的第一次显示,但是当我尝试向堆栈中添加和删除子视图时,有些视图不应该被修改而失去约束,并且在某些情况下,应显示的内容并不会执行此操作。我想要显示所有UILabel和要更新的单元格的高度。

按下按钮[+]时调用的方法如下:

@objc private func changeImage(sender: UIButton) {

    let index = (Int(sender.accessibilityValue!)!)
    let open : Bool = openItem[index]
    let plateStack : UIStackView = plateStacks[index]
    let plates : [UILabel] = platesViews[index]

    if !open {
       sender.setImage(UIImage(named: "less")?.withRenderingMode(.alwaysTemplate), for: .normal)
       let nPlatesToAdd = max(platesViews[index].count - 3, 0)
       for i in 0..<nPlatesToAdd {
            let plate = plates[i + 3]
            plateStack.addArrangedSubview(plate)
            plate.leadingAnchor.constraint(equalTo: plateStack.leadingAnchor, constant: 0).isActive = true
            plate.trailingAnchor.constraint(equalTo: plateStack.trailingAnchor, constant: 0).isActive = true
        }
    }
    else {
        sender.setImage(UIImage(named: "more")?.withRenderingMode(.alwaysTemplate), for: .normal)
        var i = plateStack.arrangedSubviews.count - 1
        while i > 2 {
            let view = plateStack.arrangedSubviews[i]
            plateStack.removeArrangedSubview(view)
            view.removeFromSuperview()
            i = i - 1
        }
    }
        openItem[index] = !open
}

单元格的第一次显示(一切正常),然后单击[+]按钮:

enter image description here

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为tableView已呈现其布局。 您可能需要检查一些原因:

  • 确保将stackView约束正确放置到contentView中
  • stackView的分发必须为return [(day != 1 && day != 6), ''];
  • 在更改了影响tableView高度的内容之后,可以使用以下代码更新单元格高度,而无需重新加载表格:

    let fechasEspecificas = ["2018-11-06"] jQuery.datepicker.setDefaults({ "minDate": 2, "maxDate": new Date(2019,0,31), beforeShowDay: function(date) { let string = jQuery.datepicker.formatDate('yy-mm-dd', date); if (contains(fechasEspecificas,string)) { return [false, ''] } else { let day = date.getDay(); return [(day != 1 && day != 6), '']; } } }); function contains(a, obj) {var i = a.length;while (i--) {if (a[i] === obj){return true;}}return false;} jQuery('input').datepicker();
    fill