可变高度UITableViewCell,自动布局,程序化。无法获得正确的身高

时间:2015-04-05 17:45:28

标签: uitableview swift autolayout

我正在以编程方式创建一个UITableViewCell。无法在iOS 7中使用它.iOS8适用于UITableViewAutomaticDimension。在这个简化版本中,单元格有一个带有可变行数的标签。我正在尝试计算响应表格视图的高度。我尝试了很多次呼叫,但没有成功。这是代码

此例程使用标签和约束填充cell.contentView。我没有为这个细胞分类。这是在一个视图控制器中,它也管理表视图。

这是表视图控制器的完整源代码。单行和带有中断的行显示正常,但应该自动换行的长行显示为单行并最终离开视图的右边缘。

这是从AppDelegate以编程方式加载的,没有笔尖或故事板。

import UIKit

class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
func createSRView(hView: UIView, index: Int) {
    var testLabel = UILabel()
    testLabel.numberOfLines = 0
    testLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    switch index {
    case 0:
        testLabel.text = "This is a test of one line"
    case 1:
        testLabel.text = "This\nis\na test of\nmultiple lines"
    case 2:
        testLabel.text = "This is a test of a really long line that should definitely wrap to several lines in the simulator"
    default:
        testLabel.text = "nothing interesting"
    }
    testLabel.setTranslatesAutoresizingMaskIntoConstraints(false)

    hView.addSubview(testLabel)
    hView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[testLabel]-|", options: nil, metrics: nil, views: ["testLabel": testLabel]))
    hView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[testLabel]-|", options: nil, metrics: nil, views: ["testLabel": testLabel]))
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell: UITableViewCell?
    cell = UITableViewCell()
    createSRView(cell!, index: indexPath.row)
    return cell!
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    // var protoCell = tableView.dequeueReusableCellWithIdentifier("myCell") as! UITableViewCell
    var protoCell = UITableViewCell()
    createSRView(protoCell.contentView, index: indexPath.row)
    protoCell.contentView.bounds = CGRectMake(0, 0, CGRectGetWidth(tableView.bounds), 1000.0)
    protoCell.setNeedsUpdateConstraints()
    protoCell.updateConstraintsIfNeeded()
    protoCell.setNeedsLayout()
    protoCell.layoutIfNeeded()
    let height = protoCell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
    println("Height for row \(indexPath.row) = \(height)")
    return height + 1.0
}
}

0 个答案:

没有答案