3

我正在尝试在以编程方式实现的自定义 UITableViewCell 上使用 iOS 6 的新自动布局功能。我添加了 addConstraint 调用,它一开始可以正常工作——直到我滚动。当我滚动布局后回到单元格时,布局被丢弃。垃圾我的意思是字段之间的边距都是错误的(太大,远远超出单元格的大小)。我推测这与 dequeueReusableCellWithIdentifier 方法给我留下一个“脏”单元格有关,就像你发现自己需要重新初始化单元格内的字段一样,但我似乎无法做任何事情来哄它正确渲染再次。在返回单元格之前,我尝试调用 [self.contentView updateConstraints]。我已经尝试破坏约束并重新创建它们。不仅不行,但是如果在 layoutSubviews 中尝试它,它会冻结在某种无限循环中。有任何想法吗?

这是建立约束的代码。它位于 initWithStyle:reuseIdentifier:

[self.completedLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.nextSetHeaderLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.nextSetDetailLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.youWillLearnHeaderLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.youWillLearnDetailLabel setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.contentView removeConstraints:[self.contentView constraints]];

NSDictionary *views = NSDictionaryOfVariableBindings(_completedLabel, _nextSetHeaderLabel, _nextSetDetailLabel, _youWillLearnHeaderLabel, _youWillLearnDetailLabel);

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_completedLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];
[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_nextSetHeaderLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_nextSetDetailLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_youWillLearnHeaderLabel]-5-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_youWillLearnDetailLabel]-4-|"
                                         options:0
                                         metrics:nil
                                           views:views]];

[self.contentView addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[_completedLabel]-12-[_nextSetHeaderLabel]-0-[_nextSetDetailLabel]-12-[_youWillLearnHeaderLabel]-0-[_youWillLearnDetailLabel(>=20)]-1-|"
                                         options:0
                                         metrics:nil
                                           views:views]];
4

2 回答 2

1

我也遇到了这个问题。如果我没有将单元格出列,那么一切似乎都正常 - 滚动、旋转等。但是,如果我将单元格出列,那么布局开始变得混乱。我可以让它工作的唯一方法是重写单元格的 prepareForReuse 方法。在这种方法中,

    1. 删除所有自定义子视图
    2. 从 contentView 中删除与这些子视图关联的所有约束
    3. 再次添加子视图和约束
-(void) prepareForReuse
{
    [self removeCustomSubviewsFromContentView];
    [self.contentView removeConstraints:self.constraints] //self.constraits holds all the added constraints
    [self setupSubviewsInContentView];
    [self addConstraintsToContentView];
}

如果有更好的方法来做到这一点,我也很想学习 :) 我相信 dequeing 的优点是 tableView 不必在内存中保存大量单元格 - 但是,使用这种方法,一个有每次出队时都要承担基本上设置单元的成本。

于 2013-10-22T09:59:46.497 回答
0

我有一个类似的问题,如果有人有兴趣我找到了解决方案,请参阅这个问题

我做了什么:

- (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];
    }
}
于 2013-06-20T12:25:34.143 回答