5

我在使用 iOS 8 beta 4(和 beta 5)时遇到问题,这是 UILabel 没有显示 UITableViewCells 中的所有文本。我使用自定尺寸单元来制作这个,以及一个适用于所有设备的故事板。

这是我在 iPhone 上得到的:-

iphone截图

代码 :-

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()
}

这是我的故事板:- 故事板

我认为这是 beta 4 中的一个错误,但它应该在 beta 5 中修复,正如发行说明所说:

在 beta 5 中修复:当多行标签的宽度由于某些视图的 layoutMargins 变化而发生变化时,标签的固有内容大小不会在应该失效的时候失效。因此,布局可能会意外截断标签(或文本视图)。/// 解决方法:layoutMargins 正在更改的视图应覆盖 layoutMarginsDidChange 并将 invalidateIntrinsicContentSize 发送到标签。

4

2 回答 2

0

You are adding quite a large margin on your tableview through constraints, this is the distance to the edge. If you set this distance to 8 or Standard, this distance will be gone. This should solve the problem with the TableViewCell height too, if not, check out this code:

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
}
于 2015-03-22T21:07:38.900 回答
0

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

class TableViewController: UITableViewController

    override func viewDidLoad() {
        super.viewDidLoad()

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

设置单元格 textLabel(多行和自动换行):

...
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 {

}
...

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

于 2015-08-19T15:28:11.303 回答