具有大小等级的自定义UITableViewCells中的多行UILabel - iOS 8&迅速

时间:2014-08-07 17:18:52

标签: ios uitableview uilabel constraints size-classes

我遇到了iOS 8 beta 4(以及beta 5)的问题,这是UILabel未显示UITableViewCells中的所有文本。我使用了自定义单元格来制作这个,以及所有设备的故事板。

这是我在iPhone上得到的: -

iphone screenshot

代码: -

ViewController.swift

@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell")

    self.tableView.estimatedRowHeight = 200
    self.tableView.rowHeight = UITableViewAutomaticDimension
}


func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell


    switch indexPath.row {
    case 0:
        cell.label.text  = "hello hello hello hellohellohellohellohello hello hello hello hello hello hello hello hellohellohello hellohello hellohellohellohellohello hello hello hello hello hello hello hello hello hello hello hello hello hellohellohello hello hello hello"
    case 1:
        cell.label.text  = "doesn'twork doesn'tworkdoesn't work doesn'twork doesn'tworkdoesn't work doesn'twork doesn'twork doesn't workdoesn't workdoesn'twork doesn'twork doesn't workdoesn't workdoesn't workdoesn'twork "
    case 2:
        cell.label.text  = "baims baimsbaimsbaims baimsbaimsbaimsbaims baims baimsbaims baimsbaimsbaimsbaims baimsbaims baims baimsbaimsbaims baimsbaims baims baimsbaimsbaimsbaims baimsbaims baimsbaims baimsbaims"
    default:
        cell.label.text  = "hello hello hello hellohellohellohellohello hello hello hello hello hello hello hello hellohellohello hellohello hellohellohellohellohello hello hello hello hello hello hello hello hello hello hello hello hello hellohellohello hello hello hello"
    }


    cell.setNeedsUpdateConstraints()
    cell.updateConstraintsIfNeeded()

    return cell
}

TableViewCell.swift

var label : UILabel!
var didUpdateConstraints = false

override init(style: UITableViewCellStyle, reuseIdentifier: String) {

    self.label = UILabel()
    self.label.textColor     = self.label.tintColor
    self.label.numberOfLines = 0

    self.label.setTranslatesAutoresizingMaskIntoConstraints(false)

    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.contentView.addSubview(self.label)
}

override func updateConstraints() {
    if !self.didUpdateConstraints {

        self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Leading, relatedBy: .Equal, toItem: self.contentView, attribute: .Leading, multiplier: 1, constant: 20))

        self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Trailing, relatedBy: .Equal, toItem: self.contentView, attribute: .Trailing, multiplier: 1, constant: 20))

        self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Bottom, relatedBy: .Equal, toItem: self.contentView, attribute: .Bottom, multiplier: 1, constant: 10))

        self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Top, relatedBy: .Equal, toItem: self.contentView, attribute: .Top, multiplier: 1, constant: 13))


        self.didUpdateConstraints = true
    }

    super.updateConstraints()
}

这是我的故事板: - storyboard

我认为这是测试版4中的一个错误,但它应该在测试版5中修复,因为发行说明说:

  

修正了测试版5:   当多行标签的宽度由于某些视图的layoutMargins的更改而发生更改时,标签的内在内容大小应该是无效的。因此,布局可能会意外地截断标签(或文本视图)。 ///解决方法:layoutMargins正在更改的视图应覆盖layoutMarginsDidChange并将invalidateIntrinsicContentSize发送到标签。

2 个答案:

答案 0 :(得分:0)

您通过约束在tableview上添加了相当大的余量,这是到边缘的距离。如果将此距离设置为8或Standard,则此距离将消失。这应解决TableViewCell高度的问题,如果没有,请查看此代码:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let label = // Get the label from the cell here
    return label.frame.size.height + 16 // Assuming you have 2 constraints on top & bottom, each 8
}

答案 1 :(得分:0)

您必须将以下行添加到“TableViewController”:

class TableViewController: UITableViewController

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.estimatedRowHeight = 70
        self.tableView.rowHeight = UITableViewAutomaticDimension
    }
...

设置单元格textLabel(multiline& wordwrap):

...
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell                
        cell.textLabel?.numberOfLines = 0
        cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
}
...

删除该功能(不再需要):

...
func override tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

}
...

自动适合我的多线表视图单元格高度。