使UItableview单元格高度等于其子UItableview

时间:2017-09-20 17:51:31

标签: ios iphone uitableview swift3

我有一个包含UItableview的UItableview单元格,我需要使该单元格的高度等于其子UItableview的高度。 下图解释了我需要做什么。

here

2 个答案:

答案 0 :(得分:1)

首先看看我的ViewController,它有一个tableview(tblview)和UITableViewCell(CustomTableViewCell),

class ViewController: UIViewController {

    @IBOutlet var tblview:UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tblview.delegate = self
        self.tblview.dataSource = self

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

extension ViewController:UITableViewDelegate,UITableViewDataSource{

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.identifier) as! CustomTableViewCell
        return cell
    }


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
}

然后看我的CustomTableViewCell,它在一个单元格中有一个表视图和一个标签。参见,

class CustomTableViewCell: UITableViewCell {

    static let identifier = "CustomTableViewCell"

    @IBOutlet var tblviewCell:UITableView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.tblviewCell.delegate = self
        self.tblviewCell.dataSource = self
        tblviewCell.isScrollEnabled = false
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {

        let heighToReturn = self.tblviewCell.contentSize.height + 20 // upper and down space
        return CGSize(width: self.tblviewCell.contentSize.width, height: heighToReturn)
    }

}

extension CustomTableViewCell:UITableViewDelegate,UITableViewDataSource{

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: customCell.identifier) as! customCell
        cell.lblname?.text = "Vikas"
        return cell
    }


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80
    }

}

class customCell: UITableViewCell {

    static let identifier = "customCell"

    @IBOutlet weak var lblname :UILabel?

}

因此,如果您在 systemLayoutSizeFitting 方法中提供tableview内容大小高度,则问题将得到解决。

我希望这会有所帮助。

答案 1 :(得分:0)

这里是如何做表头单元格的。单元格需要在故事板和子类中进行原型化(如果需要配置)。然后在表视图委托中覆盖以下func。或者,您可以动态生成视图并从viewForHeaderInSection返回。

var date = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
                .matches(in: dateStr, range: NSRange(location: 0, length: dateStr.count))
                .flatMap{$0.date}
print(date!) 

对于细胞本身,它非常相似:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 150
    }

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let headerCell = tableView.dequeueReusableCell(withIdentifier: "ConferenceHeaderCell") as! ConferenceDetailHeaderCell
        // configure cell 
        return headerCell
    }

并且依赖,您可以实施' heightForRowAtIndexPath'