如何更改UITableViewCell的intrinsicContentSize?

时间:2016-07-27 08:29:32

标签: swift uitableview autolayout

我创建了一个UITableView,其中的单元格在您点击时会展开。它模拟了以下项目:https://github.com/rushisangani/TableViewCellExpand

基本上,单元格容器视图有两个子视图,用作扩展/收缩状态的容器 - "前面"并且"返回",每个都被约束到单元格的主要内容视图的顶部,底部,前导和后沿。为了使单元格展开或收缩,我只需在前视图和后视图的底部约束上切换isActive属性。这是有效的,但只有在我点击它时重新加载单元格。如果我只是更改约束然后尝试调用invalidateIntrinsicContentSize(),则不会发生任何事情。

class DateSelectionTextField: UITextField {
    var datePickerView: UIDatePicker!
    var dateString: String? {
        willSet {
            self.text = newValue
        }
    }
    func createPickerView(dateFormatter: String) {
        datePickerView = UIDatePicker(frame: CGRectZero)
        if dateFormatter == "MM/dd/yyyy" {
            datePickerView.minimumDate = displayDateForDateOfBirth("01/01/1940")
            datePickerView.maximumDate = displayDateForDateOfBirth(displayStringForDateOfBirth(NSDate())!)
        } else if dateFormatter == "yyyy/MM/dd" {
            datePickerView.minimumDate = displayDateForTransaction("01/01/1940")
            datePickerView.maximumDate = displayDateForTransaction(displayStringForTransaction(NSDate()))
        }
        datePickerView.datePickerMode = .Date
    datePickerView.addTarget(self, action: #selector(dateValueChanged), forControlEvents: UIControlEvents.ValueChanged)
        self.inputView = datePickerView
    }
    func dateValueChanged() {// Date action for date picker view
        dateString = displayStringForDateOfBirth(datePickerView.date)
    }
}

幕后发生了什么?为什么不重新加载单元格会重新计算其大小?

1 个答案:

答案 0 :(得分:2)

如果要根据内在内容大小收缩/扩展单元格,则需要执行以下3个步骤:

  1. 配置表格视图:

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 44
    

    对于静态表视图控制器,您需要实现heightForRowAtIndexPath并返回UITableViewAutomaticDimension

  2. 更新单元格约束以反映合同/扩展状态

  3. 请求表格视图反映更改:

    tableView.beginUpdates()
    tableView.endUpdates()