Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableViewCell舍入错误,带有NSAutoresizingMaskLayoutConstraint,但大小在情节提要中设置正确,高度为RowAtIndexPath:_Ios_Objective C_Uitableview_Autolayout - Fatal编程技术网

Ios UITableViewCell舍入错误,带有NSAutoresizingMaskLayoutConstraint,但大小在情节提要中设置正确,高度为RowAtIndexPath:

Ios UITableViewCell舍入错误,带有NSAutoresizingMaskLayoutConstraint,但大小在情节提要中设置正确,高度为RowAtIndexPath:,ios,objective-c,uitableview,autolayout,Ios,Objective C,Uitableview,Autolayout,我正在尝试使用AutoLayout配置表视图单元格中的子视图,在理想情况下,我希望表视图单元格的高度与包含所有子视图所需的高度相同。但是,这似乎是不可能的,因为单元的高度是在实际创建单元之前确定的 所以,现在,我只是查看了我设置的约束,计算了包含所有内容所需的总高度,并在故事板中将其设置为该特定TableViewCell原型单元的行高,我还在tableView:HeightForRowatineXpath:方法中返回该高度 现在,我的表视图单元格如下所示(故事板截图): 有两个约束没有显示大小

我正在尝试使用AutoLayout配置表视图单元格中的子视图,在理想情况下,我希望表视图单元格的高度与包含所有子视图所需的高度相同。但是,这似乎是不可能的,因为单元的高度是在实际创建单元之前确定的

所以,现在,我只是查看了我设置的约束,计算了包含所有内容所需的总高度,并在故事板中将其设置为该特定TableViewCell原型单元的行高,我还在
tableView:HeightForRowatineXpath:
方法中返回该高度

现在,我的表视图单元格如下所示(故事板截图):

有两个约束没有显示大小,它们都有大小10(按钮顶部容器视图和滑块与中间标签之间的距离)

从上到下的距离如下:

  • 10(距离)
  • 50(按钮高度)
  • 20(距离)
  • 20(标签高度)
  • 10(距离)
  • 30(滑块高度)
  • 20(距离)
导致总高度为160

这正是我在这个牢房的检查员中设置的:

但是从第一个屏幕截图中可以看到,Interface builder抱怨约束冲突(这就是为什么它们显示为红色)。如果我将高度设置为161,IB会感到满意,但这是错误的

此外,如果我这样做,我会在运行时由于约束冲突而出现异常:

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:0x8d80240 V:[UISlider:0x8d81190(30)]>",
"<NSLayoutConstraint:0x8d833e0 V:[UILabel:0x8d83300(20)]>",
"<NSLayoutConstraint:0x8d83750 V:[UIButton:0x8d83600(50)]>",
"<NSLayoutConstraint:0x8d85050 V:|-(10)-[UIButton:0x8d83600]   (Names: '|':UITableViewCellContentView:0x8d80ef0 )>",
"<NSLayoutConstraint:0x8d851d0 V:[UILabel:0x8d83300]-(10)-[UISlider:0x8d81190]>",
"<NSLayoutConstraint:0x8d85200 V:[UISlider:0x8d81190]-(20)-|   (Names: '|':UITableViewCellContentView:0x8d80ef0 )>",
"<NSLayoutConstraint:0x8d85320 V:[UIButton:0x8d83600]-(20)-[UILabel:0x8d83300]>",
"<NSAutoresizingMaskLayoutConstraint:0x8d8b7a0 h=--& v=--& V:[UITableViewCellContentView:0x8d80ef0(161)]>"
(目前,我总是希望最后一个单元是大而特殊的单元)

所以,好吧,当我将行高度设置为160时,IB会抱怨,但当我将其设置为161时,运行时会抱怨。因此,我尝试忽略IB,并在故事板中将行高设置为160(如第二个屏幕截图所示)。在这种情况下,我得到了相同的错误消息,但有一点不同:

"<NSLayoutConstraint:0x17809ce80 V:[UISlider:0x125613660(30)]>",
"<NSLayoutConstraint:0x1782814f0 V:[UILabel:0x125615100(20)]>",
"<NSLayoutConstraint:0x178281a90 V:[UIButton:0x125615b50(50)]>",
"<NSLayoutConstraint:0x178281b80 V:|-(10)-[UIButton:0x125615240]   (Names: '|':UITableViewCellContentView:0x178161980 )>",
"<NSLayoutConstraint:0x178281c20 UIButton:0x1256157b0.height == UIButton:0x125615240.height>",
"<NSLayoutConstraint:0x178281d10 UIButton:0x1256157b0.height == UIButton:0x125615980.height>",
"<NSLayoutConstraint:0x178281e00 V:[UILabel:0x125615100]-(10)-[UISlider:0x125613660]>",
"<NSLayoutConstraint:0x178281e50 V:[UISlider:0x125613660]-(20)-|   (Names: '|':UITableViewCellContentView:0x178161980 )>",
"<NSLayoutConstraint:0x178281f40 UIButton:0x125615980.height == UIButton:0x125615b50.height>",
"<NSLayoutConstraint:0x178282030 V:[UIButton:0x125615240]-(20)-[UILabel:0x125615100]>",
"<NSAutoresizingMaskLayoutConstraint:0x178283340 h=--& v=--& V:[UITableViewCellContentView:0x178161980(159.5)]>"
“”,
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
表格视图单元的高度约束现在是159.5,而不是160。我以前也遇到过160.5版本,故事板设置相同,但我不确定这是从哪里来的

所以,首先我认为这只是IB中的一个显示错误,但现在它实际上似乎创建了错误的约束。它使用160.5(或159.5)而不是指定的160 I创建约束为什么?对此我能做些什么?

顺便说一句:单元格似乎显示正确,但我怀疑我是否能看到0.5点的差异。主要是,我想消除异常,因为它们使调试更加困难,但我也想知道这里发生了什么

更新: 159.5不仅仅是由于我刚才注意到的情节提要设置,它是情节提要设置和
tableView:heightforrowatinexpath:
返回值的奇怪组合。 以下是生成的autoresizingmasklayoutconstraint的高度的几个示例,具体取决于情节提要高度(sb)设置和
tableView:heightForRowAtIndexPath:
方法(method)的返回值。在所有情况下,子视图的约束应导致高度为160,并且不会更改

  • 160(sb)和160(方法):159.5(限制)
  • 161(sb)和160(方法):159.5(限制)
  • 160(sb)和161(方法):160.5(限制)
  • 162(sb)和161(方法):162(限制)
  • 161(sb)和162(方法):161(约束)
  • 162(sb)和162(方法):162(约束)
  • 所以我想,好吧,他们都同意,我将标签的高度设为22,这样子视图的总高度也将是162。结果:

    6a。162(sb)和162(方法),162(子视图的总高度):161.5(约束)

    什么

    知道这里发生了什么吗

    更新2
    我提供了一个复制该问题的示例项目。

    现在您已经将该示例上载到github,我可以看到约束实际上被过度确定了。有太多的“这等于那”,特别是在垂直间距/高度方面。我简化了约束条件,并能够将代码更改为:

    -(CGFloat)tableView:(UITableView *)tableView 
        heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return 44;
        } // else
        UITableViewCell* cell = 
            [tableView dequeueReusableCellWithIdentifier:@"LargeCell"];
        CGSize sz = 
            [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingExpandedSize];
        return sz.height;
    }
    

    如果我没有弄错的话,这正是您所追求的,即让约束本身决定单元格的高度。

    分隔符
    会干扰
    内容视图
    的高度,或者应该禁用它(并在需要时替换为自定义分隔符)因此,
    contentView
    高度与
    单元格的高度相匹配,或者考虑到
    contentView
    高度可能与
    单元格的高度不匹配,应将约束更改为更灵活。两种方法都做会更好。

    有没有机会获得故事板和其他需要的文件来复制它?我将看看是否可以在一个较小的示例项目中复制它。我创建了一个小示例项目。在这个问题存在的时候,上传并保存它的最好和最简单的方法是什么?把它放在github上。这允许其他人使用它并提交自己的更改。@A-Live我添加了一个具有相同问题的示例项目。感谢您发布了一个完整的示例,说明如何正确使用
    systemLayoutFittingSize
    ,这是我在查看其他一些问题和您的书的示例时遇到的问题。我接受了@A-Live的回答,因为它能更好地解释原因。不过,你们的解释更好地说明了这一点。谢谢你有趣的讨论。@JoachimKurz在我看来(这不关我的事),你接受A-live的回答是对的。我没有提到分离器,因为我没有想到!(
    -(CGFloat)tableView:(UITableView *)tableView 
        heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return 44;
        } // else
        UITableViewCell* cell = 
            [tableView dequeueReusableCellWithIdentifier:@"LargeCell"];
        CGSize sz = 
            [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingExpandedSize];
        return sz.height;
    }