gpt4 book ai didi

xcode - 自定义编程 UITableViewCell 的自动布局在滚动时失败

转载 作者:行者123 更新时间:2023-12-01 09:04:25 25 4
gpt4 key购买 nike

我正在尝试在以编程方式实现的自定义 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]];

最佳答案

我也遇到了这个问题。如果我没有使单元格出列,一切似乎都可以正常工作——滚动、旋转等。但是,如果我使单元格出列,那么布局就会开始变得困惑。让它工作的唯一方法是覆盖单元格的 prepareForReuse 方法。在这个方法中,

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

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

关于xcode - 自定义编程 UITableViewCell 的自动布局在滚动时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13854485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com