【问题标题】:How to shrink a UIView's size to zero if hidden, in a UITableViewCell?如果在 UITableViewCell 中隐藏,如何将 UIView 的大小缩小为零?
【发布时间】:2021-11-04 09:14:58
【问题描述】:

如果您将文本设置为 UILabel,它将更新其内容大小以使其全部显示。我想对自定义按钮做同样的事情。但是,如果按钮被隐藏,我不想更改文本,而是将其缩小为零大小。 (类似于 Android 的 VISIBILITY_GONE)

所以我又在玩自动布局系统,但无法解决这个问题:

在我的 XIB 文件中,我定义了一个按钮。该按钮是一个自定义子类,它覆盖intrinsicContentSize。如果按钮被隐藏或它的 alpha 设置为 0,则 intrinsicContentSize 将为 (0,0) ,否则为实际固有大小。

- (CGSize)intrinsicContentSize{
    if (self.zeroSizeIfHidden && (self.hidden || self.alpha == 0)) {
        return CGSizeZero;
    }
    CGSize const size = [super intrinsicContentSize];
    return size;
}

现在我试图告诉布局系统更新所有相关的布局约束,但失败了。该按钮应该在 UITableViewCell 中可见 - 但它不可见。它只是在下一个“淡入淡出”动画中弹出并隐藏。不,如果不需要,我不能简单地将其从屏幕上删除。当用户点击它时,单元格会增长和缩小。

这是我迄今为止尝试过的,来自我的 UITableViewCell:

if (self.button.hidden || self.button.alpha == 0) {
    self.button.hidden = NO;
    self.button.alpha = 1;
    [self.button invalidateIntrinsicContentSize];
    [self.button setNeedsLayout];
    [self.button layoutIfNeeded];
    [self.button.superview invalidateIntrinsicContentSize];
    [self.button.superview setNeedsLayout];
    [self.button.superview layoutIfNeeded];
}

我错过了什么?有什么我还没有尝试过的吗?我想我需要一些 Autolayout 大师的帮助。

背景:单元格本身是使用自动布局构建的。它会显示一些信息,并在您点击它时扩展为完整信息。除了完整的信息外,还应显示该按钮 - 在几种情况下。

编辑:

我正在寻找一些想法,如何强制自动布局机制查询按钮的新大小。

(查看实际操作:它是“POI Toolbox”的“信息和文档”表视图。只需点击地图屏幕右下方的“i”按钮。(AppStore:https://apps.apple.com/de/app/poi-toolbox/id1547993322))

【问题讨论】:

  • 尝试拼凑一个minimal reproducible example。我们不知道您的视图层次结构是什么,您设置了哪些约束,您如何告诉 UI 进行更改,等等(而且您真的不能指望人们安装一些随机应用程序并试图弄清楚您是什么)再谈)

标签: ios uitableview autolayout


【解决方案1】:

我遇到了自动布局约束的问题。每个单元格都使用自定义背景视图。因此,下方单元格的 BG 视图隐藏了按钮,而按钮本身只是放置在可见区域之外。

这个实现对于自定义按钮是正确的:

- (CGSize)intrinsicContentSize{
    if (self.zeroSizeIfHidden && (self.hidden || self.alpha == 0)) {
        return CGSizeZero;
    }
    CGSize const size = [super intrinsicContentSize];
    return size;
}

或者,如果您更喜欢简短的变体并且不需要调试:

- (CGSize)intrinsicContentSize{
    return (self.zeroSizeIfHidden && (self.hidden || self.alpha == 0))
        ? CGSizeZero : [super intrinsicContentSize];
}

对于单元格来说,这就足够了:

// Code...
if (self.button.hidden || self.button.alpha == 0) {
    self.button.hidden = NO;
    self.button.alpha = 1;
}
// Code...

随着表格视图重新加载行,按钮大小正在更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多