UITableCell没有正确调整大小

时间:2015-06-15 10:28:02

标签: ios swift uitableview

在我的第一个iPhone应用程序上工作时,我在尝试使用“自动”表格单元格大小调整时遇到了问题。当我加载应用程序时,前几个单元格总是很大,大约应该是它的6倍。然后,当我向下滚动并向后滚动时,它们将重置为它们应该的高度。 (例如,见图片,很难解释)

http://imgur.com/a/yzd6P(前2张图片)

到目前为止,我已经尝试了一些我无法在此发布的教程和stackoverflow答案,因为我只能发布2个链接,其中大多数只涉及添加UITableViewAutomaticDimension属性。

我在故事板中制作了单元格(包含4个标签,所有#行设置为0和3个图像(参见第三张图片))并给它一个标识符,然后为它创建一个自定义类来更改标签'文本。

像这样调整单元格大小:

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 104

使用以下行似乎解决了大多数设备上的问题,但它仍然存在于iPhone 6 plus(第四张图片)上:

tableView.reloadSections(NSIndexSet(indexesInRange: NSMakeRange(0, self.tableView.numberOfSections())), withRowAnimation: UITableViewRowAnimation.Fade)

绘制单元格:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->   UITableViewCell {
    var cell:TableCell? = tableView.dequeueReusableCellWithIdentifier("tableCell") as? TableCell

    if cell == nil {

        cell = TableCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "tableCell")
    }

    cell?.lblObituaryName.text = obituaryArray[indexPath.row].name
    cell?.lblObituaryBirth.text = obituaryArray[indexPath.row].dateOfBirth
    cell?.lblObituaryDeath.text = obituaryArray[indexPath.row].dateOfDeath
    cell?.lblObituaryPlace.text = obituaryArray[indexPath.row].city

    cell?.setNeedsUpdateConstraints()
    cell?.updateConstraintsIfNeeded()


    return cell!
}

故事板中的单元格设置是第5张和最后一张图像。

细胞限制:

Table cell is 104.0 high

Main title label:
Trailing space to: Superview = 0
Leading space to: Superview = 0
Top space to: Superview = 0
Bottom space to: Label1 = 6
Bottom space to: Label1Image = 1

Label 1:
Trailing space to: Superview = 0
Leading space to: Label1Image = 5
Bottom space to: Label2 = 6
Top space to: Main Label = 6

Label 1 Image:
Leading space to: Superview = 0
Width = 25
Height = 25
Trailing space to: Label1 = 5
Bottom space to: Label2Image = -3
Top space to: Main Label = 1

Label 2:
Trailing space to: Superview = 0
Leading space to: Label2Image = 5
Bottom space to: Label3 = 6
Top space to: Label2 = 6

Label 2 Image:
Leading space to: Superview = 0
Width = 25
Height = 25
Trailing space to: Label2 = 5
Bottom space to: Label3Image = -3
Top space to: Label1Image = -3

Label 3:
Trailing space to: Superview = 0
Bottom space to: Superview = -1
Leading space to: Label3Image = 5
Top space to: Label2 = 6

Label 3 Image:
Leading space to: Superview = 0
Width = 25
Height = 25
Trailing space to: Label3 = 5
Top space to: Label2Image = -3

通过将约束优先级更改为999来修正以下错误。但仍在寻找上述问题的答案。

Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(

    "<NSLayoutConstraint:0x7a0affb0 UILabel:0x7a079ea0'Mw. J.H. Zwierenga'.top == UITableViewCellContentView:0x7a074170.topMargin>",

    "<NSLayoutConstraint:0x7a0b00a0 V:[UILabel:0x7a079ea0'Mw. J.H. Zwierenga']-(6)-[UILabel:0x7a0394f0'21 May 2015']>",

    "<NSLayoutConstraint:0x7a0b0190 V:[UILabel:0x7a0394f0'21 May 2015']-(6)-[UILabel:0x7a0a1f20'1 December 1935']>",

    "<NSLayoutConstraint:0x7a0b0280 UITableViewCellContentView:0x7a074170.bottomMargin == UILabel:0x7a094e10'Oudeschild'.bottom - 1>",

    "<NSLayoutConstraint:0x7a0b02b0 V:[UILabel:0x7a0a1f20'1 December 1935']-(6)-[UILabel:0x7a094e10'Oudeschild']>",

    "<NSLayoutConstraint:0x7a0b2fe0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7a074170(0)]>"

)



Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0x7a0b02b0 V:[UILabel:0x7a0a1f20'1 December 1935']-(6)-[UILabel:0x7a094e10'Oudeschild']>



Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.

The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

如果需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

  1. 立即尝试使用layoutIfNeeded更新约束。
  2. 对于修复警告,您应将垂直约束优先级之一设置为999。
  3. 如果将附件视图设置为无

    ,则一切正常

答案 1 :(得分:0)

试试这个

OUTPUT