2015-04-05 54 views
1

我正在以編程方式創建一個UITableViewCell。無法讓它在iOS 7中工作。iOS8與UITableViewAutomaticDimension非常相稱。在這個簡化版本中,單元格有一個標籤,其行數可變。我試圖計算高度來響應表視圖。我嘗試了很多排列的通話,但都沒有成功。代碼如下可變高度UITableViewCell,自動佈局,編程式。無法得到正確的高度

此例程使用標籤和約束填充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 
} 
} 

回答

2

請看看這裏。這個問題通過代碼和IB都有解決方案。 UILabel AutoLayout

+0

涉水通過我找到了一些工作。 testLabel.preferredMaxLayoutWidth = tableView.bounds.width - 20.設置preferredMaxLayoutWidth取得了訣竅。內容擁抱和抗壓力並沒有改變它。我甚至刪除了所有的protoCell更新約束和佈局。只有首選的最大布局寬度,它工作。謝謝!太糟糕了解決方案是特定於UILabel。我有與UITextView()相同的問題。我認爲自動佈局會更自動地照顧它:) – David 2015-04-09 05:33:15

+0

您可以簡單地從左側和頂部剪切視圖(無論是UITextView還是UiLabel),然後轉到您的內容擁抱屬性並將其優先級設置爲小於您的優先級視圖的(高度/寬度),相應的屬性會相應變化。 – 2015-04-09 05:39:25

+0

你是什麼意思'剪輯'?剪輯到界限不能解決它,只是將其切斷。你的意思是設定限制嗎?在我的問題中,我有各方面的限制。離開底部約束不會增加單元的高度。設置內容擁抱/壓縮優先級在我嘗試時沒有什麼不同。唯一使它工作的是在UILabel上專門設置preferredMaxLayoutWidth – David 2015-04-09 18:30:15

相關問題