使用自动布局时无法隐藏或删除 UICollectionViewCell 中的视图

Posted

技术标签:

【中文标题】使用自动布局时无法隐藏或删除 UICollectionViewCell 中的视图【英文标题】:Unable to hide or remove views in UICollectionViewCell when using Autolayout 【发布时间】:2015-04-03 07:33:07 【问题描述】:

我在 UICollectionViewCell 中有一个 UIImageView(我们称它为 myImageView),它具有必要的约束。我正在使用故事板并将视图和代码与viewWithTag 链接起来。

在 cellForItemAtIndexPath 中,有一个条件,例如:

if (1 + 1 == 2)
    myImageView.hidden = YES;
else
    myImageView.hidden = NO

我已设置断点并验证代码已执行,但 myImageView 对于第一批可见单元格没有隐藏(假设所有单元格都满足条件)。 p>

当我向下滚动以显示新的(或重用的)单元格时,一切都按预期工作(满足条件并假定隐藏的单元格被隐藏,反之亦然)。当我向上滚动以再次显示第一批单元格时,它也可以正常工作。

问题仅在于第一批可见单元格。

我尝试过removeFromSuperview,而不是隐藏单元格,但在那里也没有运气。

在这种情况下使用自动布局和 UICollectionViews 时是否有适当的方法或最佳实践?

【问题讨论】:

第一次调用 cellForItemAtIndexPath 之前条件是否为真?在第一个单元格已经显示并且您还没有调用 reloadData 之后,这听起来就像是真的 @Paulw11 我通过 API 检索数据。从 API 中检索到的是字典数组,隐藏该图像视图的条件在该字典中。从 API 成功检索数据后,我调用 reloadData。无论图像视图最初是否隐藏,它都应该根据 if else 条件相应地更新,因为我满足了这两种情况,对吗? 应该的。您使用视图标签而不是带有 IBOutlets 的自定义单元类是否有特殊原因? @Paulw11 没有特别的原因。我尝试为此创建 UICollectionViewCell 的子类,但得到了相同的结果。无论哪种方式,代码在满足或不满足隐藏条件时仍会进入正确的隐藏或取消隐藏块。不过,我有一个观察结果,如果我在情节提要中检查 imageview 的隐藏框,会发生同样的事情,但相反;对于第一批隐藏单元格,应该显示的图像视图是隐藏的。 约束不应该与.hidden有任何关系 【参考方案1】:

由于我们不能为约束设置标签,我们别无选择,只能继承 UICollectionViewCell 并将约束链接到 IBOutlet。

然后在cellForRowAtIndexPath:

cell.imageViewHeightConstraint.constant = imageViewShouldHide ? 0 : cell.imageView.image.size.height;

简单地说,在 n 值和 0 之间切换视图的高度约束,而不是在 YESNO 之间隐藏.

在采用自动布局时,我了解到我们应该停止考虑框架和矩形,但我不确定隐藏视图。感谢@Paulw11 的提示!

【讨论】:

以上是关于使用自动布局时无法隐藏或删除 UICollectionViewCell 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

自动布局隐藏第一次启动的图像

自动布局中的 UIButton 动态宽度

具有自动布局的多个动态视图

无法将 iOS 自动布局乘数设置为零

iOS 自动布局约束刷新

使用自动布局并创建动态界面(隐藏字段时自动重新对齐)