Ios 使用自动布局在动态表视图单元格中显示奇数填充

Ios 使用自动布局在动态表视图单元格中显示奇数填充,ios,uitableview,constraints,padding,autolayout,Ios,Uitableview,Constraints,Padding,Autolayout,我正在构建一个非常简单的App.net客户端,作为一种测试应用程序。它只需从App.net公共时间线中提取最近20篇帖子,并在UITableView中显示帖子、用户名和用户的头像。很简单 对于UI,我使用故事板和自动布局 UIImageView约束 身高等于:69 宽度等于:69 顶部对齐:Label-Name(用户名标签) 指向:Superview的前导空间等于:3 尾随空格到:Label-Name等于:8 尾随空格to:Label-Text(文章的文本)等于:8 名称标签约束 将顶部对

我正在构建一个非常简单的App.net客户端,作为一种测试应用程序。它只需从App.net公共时间线中提取最近20篇帖子,并在
UITableView
中显示帖子、用户名和用户的头像。很简单

对于UI,我使用故事板和自动布局

UIImageView
约束
  • 身高等于:69
  • 宽度等于:69
  • 顶部对齐:Label-Name(用户名标签)
  • 指向:Superview的前导空间等于:3
  • 尾随空格到:Label-Name等于:8
  • 尾随空格to:Label-Text(文章的文本)等于:8
名称标签约束
  • 将顶部对齐到:图像视图
  • 顶部空间到:Superview等于:5
  • 到:Superview的尾随空间等于:17
  • 图像视图的前导空间等于:8
  • 底部空间到:标签-文本等于:6
文本标签约束
  • 底部空间到:Superview等于:9
  • 到:Superview的尾随空间等于:17
  • 顶部空间到:标签-名称等于:6
  • 图像视图的前导空间等于:8
最后,为了设置每个单元格的高度,我在
表视图中使用以下代码:heightforrowatinexpath:

// Solution greatly helped by http://stackoverflow.com/questions/18746929/using-auto-layout-in-uitableview-for-dynamic-cell-layouts-heights
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    static ADNPostTableViewCell *cell;

    if (!cell) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"PostCell"];
    }

    cell.post = self.posts[indexPath.row];

    return fmax([cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height, cell.avatarImageView.frame.size.height + kImageViewPadding); // kImageViewPadding = 5
}
对于肖像画来说,这个效果非常好。我得到以下信息:

然而,对于横向,出现了一个非常特殊的填充(名称标签和文本标签之间以及文本标签和底部单元格分隔符之间有大量空白),我不知道如何找出是什么约束导致了这种情况。我尝试了各种各样的限制,但我似乎仍然无法摆脱填充


提前谢谢,如果还有什么我可以提供的帮助解决这个问题,请告诉我

我认为您需要为文本标签输入一个首选的最大宽度。我不知道为什么单元格不能从约束条件和单元格的宽度中找出这一点,但情况似乎就是这样。我注意到的另一件事是,如果你将heightForRowAtIndexPath中的一个单元格排出来进行计算,你会得到一个微妙的错误——该单元格在纵向上看起来很好,第一次旋转到横向时,但是如果你旋转回纵向,然后再旋转回横向,第一行(或有时根据字符串长度选择前几行)太高了。只有当我有足够多的行时才会发生这种情况,以至于你看不到所有的行,如果你在第一次浏览横向时滚动,那么在第二次浏览横向时,高度是正确的,但在第三次浏览时,高度不是正确的。这似乎与单元格重用有关。这可以通过在viewDidLoad中只将一个单元格出列来解决,然后使用它。您还可以通过获取标签的宽度来获取需要传递给preferredMaxLayoutWidth的值。有一个地方我仍然需要一个“魔法”数字是在HeightForRowatineXpath中返回的高度加上2。我不知道为什么会这样,但我注意到其他只有一个标签的简单单元格也存在这种情况。以下是对我有效的方法(我的RDCell设置的约束条件与您在问题中发布的约束条件相同):


当方向改变时,您没有更新
单元格的宽度
。我假设您所有的尺寸都是在
宽度=320
左右计算的。在进行计算之前,您应该设置宽度:

CGRect frame = cell.contentView.frame;
frame.size.width = tableView.bounds.size.width;
cell.contentView.frame = frame;

什么填充?你的图片信息量不大,因为你看不到标签。@rdelmar我不确定你说看不到标签是什么意思;标签显而易见。我指的神秘填充出现在Kyle Isom的帖子中。他的名字和帖子、帖子和c之间有大量空白在细胞的底部,将它与肖像图像进行比较,其中所有的东西都像设计的一样出现。也许你看到的东西和我不同。我在你的帖子里看不到任何标签。我看到两个看起来像白色矩形的图像,中间有一个正方形,上面有问号(一个长方形比另一个长一点)。。图像未加载。Dropbox中出现403个错误。@BrianNickel噢,我很抱歉!它们出现在我面前,这是可以理解的,所以我没有意识到这是一个问题。我已将嵌入的图像替换为指向它们的链接。如果它们仍然没有出现,请告诉我!您是在
tableView:heightForRowAtI中讨论这个问题吗NDEPATH:
?如果是这样,这个解决方案就不起作用了。代码中没有明确使用320的宽度。320的宽度将来自于从xib获取的初始大小。如果将xib调整为480,您应该会看到它在横向上看起来不错,但在纵向上是错误的。我更新了我的答案,因为您是从contentView而不是cel获取的l本身。无论您是否使用
contentView
还是单元格本身,包含此代码都会导致相同的问题。这似乎是可行的!但我不喜欢依赖这些神奇的数字,尤其是因为我对为什么需要这样做知之甚少。您对更动态的方法有什么建议吗如果以后布局会有轻微变化?@sethfri,我不会称之为幻数,因为它是基于你在IB中设置的约束条件,但不,没有这个数字我不知道如何操作。我现在正在研究其他一些可能性。我所说的“幻数”是什么意思它是一个静态数字,而像
tableView.bounds.size.width
这样的数字更具动态性(比如说320)。@sethfri,我已经更新了我的答案,去掉了那个“神奇”的数字——不管怎样,105还是2。我还解释了我在heightForRowAtIndexPath中对单元格进行排队时注意到的一个微妙错误。
CGRect frame = cell.contentView.frame;
frame.size.width = tableView.bounds.size.width;
cell.contentView.frame = frame;