UITableViewCell 约束未更新

Posted

技术标签:

【中文标题】UITableViewCell 约束未更新【英文标题】:UITableViewCell Constraints Not Updated 【发布时间】:2017-01-31 13:30:20 【问题描述】:

我有一个自定义的UITableViewCell,里面有UITextViewUICollectionViewUITableView。它们之间有 10 px 的空间。在某些情况下,我只有UITextView,有时只有集合视图等。

当没有文本时 - 我必须将 UICollection 视图向上移动 10 像素。如果我没有文本,tableView 和 collectionView 它应该是零高度。

- (void)configureMiddleWrapperState

    self.middleWrapperHasNote = self.noteTextView.text.length > 0;
    self.noteTextViewTopConstraint.constant = self.middleWrapperHasNote ? 7.f : 0.f;
    self.staffWrapperTopConstraint.constant = self.middleWrapperHasStaff ? 7.f : 0.f;
    self.tagsWrapperTopConstraint.constant = self.middleWrapperHasTags ? 7.f : 0.f;
    BOOL middleWrapperHasAtleastOne = self.middleWrapperHasNote || self.middleWrapperHasStaff ||
    self.middleWrapperHasTags;
    self.middleWrapperLastTenPixelSpaceConstraint.constant = middleWrapperHasAtleastOne ? 7.f : 0.f;
    [self setNeedsUpdateConstraints];


- (void)layoutSubviews

    [super layoutSubviews];
    [self setExcludedPaths];
    [self configureMiddleWrapperState];

结果与预期不同: 而不是一行。 当只有文本看起来像预期时。

只有当我多次上下滚动时,约束才会起作用。

【问题讨论】:

【参考方案1】:

尝试添加

[self setNeedsLayout];

之后

[self setNeedsUpdateConstraints];

【讨论】:

它将循环 - setNeedsLayout 强制 [self layoutSubviews] 所以我认为你必须将你的逻辑转移到其他地方。也许 - (void) awakeFromNib 会适合。 在 awakeFromNib 中我不知道如何提供注释文本等。因为它没有在 awakeFromNib 中设置 然后创建一个新方法,用文本配置单元格,然后更新约束 - (void) configureWithText:(NSString *) newText; 我找到了问题所在。因为我的 self.middleWrapperHasTags 在重用时设置不正确。顺便感谢您的帮助【参考方案2】:

我找到了问题所在。因为我的 self.middleWrapperHasTags 在重用时设置不正确。

【讨论】:

以上是关于UITableViewCell 约束未更新的主要内容,如果未能解决你的问题,请参考以下文章

自定义 tableviewcell 动态高度未根据约束更新(以编程方式自动布局)

在 UITableviewCell 中使用 UICollection 视图时未调用 UICollectionView 委托方法“didSelectItemAtIndexPath”

从 cellForRowAt 更新时,UITableViewCell 中的活动约束不会更新

如何更新 UITableViewCell 约束常量并更新单元格高度

UITableViewCell 约束更新仅在滚动后发生

如何在 UITableVIewCell 中进行 API 调用