UILabel在启动时不在自定义UITableViewCell中执行多行,但在滚动后执行

时间:2015-07-05 04:16:22

标签: ios autolayout uilabel

编辑#1

我在github上添加了一个项目链接: https://github.com/trestles/testtable

这是我第一次与Autolayout打交道,所以我希望我会做一些业余错误。老实说,我知道我是如何操纵这些操作框架的,但是通过自动布局可以使用剪辑内容来正常工作。部分问题是,如果我们总是处于纵向模式,我应该使用框架吗?

我有一个自定义的UITableViewCell,我有一些UILabel。它们设置为numberOfLines = 0。有时,他们会截断文本。像这样:

enter image description here

我该如何解决这个问题?我试过在viewDidLoad中重新加载数据,但这似乎并不重要。大多数情况下,当您滚动时,它会自行修复(但并非总是如此)。它可以是任何三个UILabel,并且与文本数量无关。我第一次使用自动布局的UILabels,所以很可能是我犯了一些错误。这是我的UILabel属性:

enter image description here

和第一个标签的布局:

enter image description here

5 个答案:

答案 0 :(得分:3)

您的自动布局 完美,只是因为您在中使用默认文字设置auto layout而出现问题XIB 即可。在您viewDidLoad中,您要更新UILabel文本,而不是以编程方式更新layout。所以只留下一行如下。

self.mainTV.layoutIfNeeded();

UITableView方法中重新加载viewDidLoad之前添加上一行。所有的事情都很好。

示例

override func viewDidLoad() {
    super.viewDidLoad()

    self.mainTV.dataSource=self
    self.mainTV.delegate=self
    self.mainTV.rowHeight = UITableViewAutomaticDimension
    self.mainTV.estimatedRowHeight = 84.0
    //self.mainTV.registerClass(MyTableViewCell.self, forCellReuseIdentifier: "MyCustomCell")


    var tmps = [String]()

    tmps.append("ABC But here is an artist. He desires to paint you the dreamiest, shadiest, quietest, most enchanting bit of romantic landscape in all the valley of the Saco. What is the chief element he employs?")
    tmps.append("DEF But here is an artist.")
    tmps.append("GHI But here is an artist. He desires to paint you the dreamiest, shadiest, quietest, most enchanting bit")

    for var i=0; i<10; i++
    {
      var menuItem=EKMenuItem()
      let randomIndex1 = Int(arc4random_uniform(UInt32(tmps.count)))
      menuItem.header = "\(i) \(tmps[randomIndex1])"

      let randomIndex2 = Int(arc4random_uniform(UInt32(tmps.count)))
      menuItem.detail = "\(i) \(tmps[randomIndex2])"
      let randomIndex3 = Int(arc4random_uniform(UInt32(tmps.count)))
      menuItem.price = "\(i) \(tmps[randomIndex3])"
      //tmpItem.price = "my price"
      dataItems.append(menuItem)
    }

    self.view.backgroundColor = UIColor.greenColor()

    self.mainTV.layoutIfNeeded();
    self.mainTV.reloadData()
    // Do any additional setup after loading the view, typically from a nib.
  }

希望这对你有所帮助。

答案 1 :(得分:2)

更新您的单元格约束和布局

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCustomCell") as! MyTableViewCell
    cell.headerLabel.text=dataItems[indexPath.row].header
    cell.setHeader(dataItems[indexPath.row].header)
    cell.setDetail(dataItems[indexPath.row].detail)
    cell.setPrice(dataItems[indexPath.row].price)
    // update constraint and layout
    cell.layoutIfNeeded()
    return cell
  }

答案 2 :(得分:2)

我从git下载了源代码。我不确定这是不是错误。但是在viewdidappear中重新加载表解决了这个问题。

override func viewDidAppear(animated: Bool) {

        mainTV.reloadData()

    }

这是执行上述操作时在模拟器上的显示方式。enter image description here

答案 3 :(得分:1)

只需在self.mainTV.reloadData()中添加viewDidLayoutSubviews()就可以解决您的问题。

您可以在此处查看更多详细信息。

http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html

答案 4 :(得分:0)

我看到你只在高度,没有宽度设置约束。 尝试设置它。