【问题标题】:UITableViewCell autolayoutUITableViewCell 自动布局
【发布时间】:2013-06-20 07:59:36
【问题描述】:

我的自动布局有问题。我有一个UITableViewCell 和一个内部视图。我希望这个视图比单元格小,所以我添加了约束:

  • 垂直空间(10)顶部
  • 垂直空间 (10) 底部
  • 水平空格 (10) 前导空格
  • 水平空格 (10) 尾随空格

当 tableView 出现时,单元格显示良好,但如果我向下滚动 tableView 并向上滚动,单元格中的视图会调整大小,现在会占用单元格中的全部空间。

正确的单元格:

不正确的单元格(滚动后)

我已经搜索过这个,但找不到类似的东西。 我认为这个人有同样的问题,但没有答案: Similar problem

提前感谢您的帮助!

【问题讨论】:

  • 请在此处添加您的相关代码:)
  • 您是从笔尖或情节提要加载单元格,还是完全用代码创建单元格?您是否使用UITableViewCell 的自定义子类?
  • @robmayoff 我为此单元使用 xib 并从 xib 加载它。我还为此使用了 UITableViewCell 的自定义子类

标签: iphone objective-c xcode autolayout


【解决方案1】:

我终于找到了我的问题here 的答案。在我的自定义 UITableViewCell 类中,我已经这样做了:

- (void)awakeFromNib
{
    [super awakeFromNib];

    for (NSLayoutConstraint *cellConstraint in self.constraints)
    {
        [self removeConstraint:cellConstraint];

        id firstItem = cellConstraint.firstItem == self ? self.contentView : cellConstraint.firstItem;
        id seccondItem = cellConstraint.secondItem == self ? self.contentView : cellConstraint.secondItem;

        NSLayoutConstraint* contentViewConstraint = [NSLayoutConstraint constraintWithItem:firstItem
                                                                                 attribute:cellConstraint.firstAttribute
                                                                                 relatedBy:cellConstraint.relation
                                                                                    toItem:seccondItem
                                                                                 attribute:cellConstraint.secondAttribute
                                                                                multiplier:cellConstraint.multiplier
                                                                                  constant:cellConstraint.constant];

        [self.contentView addConstraint:contentViewConstraint];
    }
}

我猜内容视图会调整其内容的大小或类似的东西。如果对此有更简单的解释和更简单的方法,我仍在等待其他答案。非常感谢您的帮助!

【讨论】:

  • 在 xib(或情节提要)中的 UITableViewCell 上创建的约束直接连接到单元格,而不是连接到其 contentView 子视图。但它们需要连接到contentView 才能正确布局。这就是你的修复工作的原因。不知道是Xcode的bug还是UIKit的bug。
  • @robmayoff - 我相信这是一个 IB/XCode 错误,而不是 UIKit。如果您检查 XCode 4.6 发出的故事板 XML,很明显,约束被添加到单元格而不是 contentView 的子视图。在 4.6 之后的 XCode 版本中,此问题已得到纠正,并且约束属于 contentView。
【解决方案2】:

我今天在使用 Xcode 5 和故事板时遇到了同样的问题。最初,我的自定义表格视图单元格会正确显示,但当我滚动表格视图并重用单元格时,布局会混乱。解决方法是像这样调用setNeedsLayout

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SettingTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"Setting" forIndexPath:indexPath];

    [tableViewCell.contentView setNeedsLayout];

    return tableViewCell;
}


真正的问题:

我将标签出口命名为textLabel,与 UITableViewCell 的内置标签属性同名。这引起了各种各样的怪事。一旦我将插座属性名称更改为唯一名称,我的布局问题就解决了。

【讨论】:

  • 我认为所有单元格内部都应该有一个视图,将此视图连接为单元格内容视图,然后才在其中添加内容,例如 uilabels 和其他内容。这种方式似乎摆脱了所有的问题。
  • 我对“imageView”有同样的问题。非常感谢
【解决方案3】:

这个问题是因为你的UITableView Reuse Cell 瞬间创建新的。 我给你一些建议,可能对你有帮助。

1) 在两者之间添加UIView

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath   
  {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        /// Your code;
    }
 return cell;

}

1) 将你的 UIView 添加到cell.contentView.

已编辑:

在您关注我的编辑答案之前,我想告诉您,以下代码不利于内存管理,因为它会为 UITableView 的每一行创建新单元格,所以要小心。

但是如果UITableView 有有限的行大约(50-100 可能是)os 使用以下代码,如果它适合您,则更好。

NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
    } 

【讨论】:

  • 谢谢,但这不起作用。我真的不明白为什么会这样,这不会发生在简单的uiview中,只是在tableviewcell中。也许我需要设置 [view setNeedsLayout] 或类似的东西,以便自动布局约束在 tableview 单元格中工作?
  • 再次感谢您的帮助,但这会非常缓慢且效率低下。我想以正确的方式做到这一点:)
  • 这是对 UITableView 中单元格重用模式的严重滥用,绝对应该避免,因为它会导致更多的内存使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2018-12-03
  • 2017-02-13
相关资源
最近更新 更多