当前位置: 首页 > 知识库问答 >
问题:

隐藏视图时如何使用自动布局移动其他视图?

史俊德
2023-03-14

我已经在IB中设计了我的自定义单元,将其子类化,并将我的插座连接到我的自定义类。我在单元格内容中有三个子视图,它们是:UIView(cdView)和两个标签(titleLabel和emailLabel)。根据每行可用的数据,有时我希望在单元格中显示UIView和两个标签,有时只显示两个标签。我想做的是这样设置约束,如果我将UIView属性设置为hidden,或者将其从superview中删除,则两个标签将向左移动。我试图为10px将UIView前导约束设置为Superview(单元格内容),为10px将UILabels前导约束设置为下一个视图(UIView)。稍后在我的代码中

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath {
    
    // ...

    Record *record = [self.records objectAtIndex:indexPath.row];
    
    if ([record.imageURL is equalToString:@""]) {
         cell.cdView.hidden = YES;
    }
}

我正在隐藏我的cell.cdView,我希望标签移到左侧,但它们在cell中的位置不变。我试图从superview中删除cell.cdView,但也没有成功。我附上图片,以澄清我的想法。

我知道如何通过编程来实现这一点,我并不寻求解决方案。我想要的是在IB中设置约束,我希望如果删除或隐藏其他视图,我的子视图将动态移动。在IB中使用自动布局可以做到这一点吗?

.....

共有3个答案

景靖琪
2023-03-14

对于那些只支持iOS8的人,有一个新的布尔属性处于活动状态。它将有助于动态启用只需要的约束

P. S.约束出口必须是强的,而不是弱的例:

@IBOutlet weak var optionalView: UIView!
@IBOutlet var viewIsVisibleConstraint: NSLayoutConstraint!
@IBOutlet var viewIsHiddenConstraint: NSLayoutConstraint!

func showView() {
    optionalView.isHidden = false
    viewIsVisibleConstraint.isActive = true
    viewIsHiddenConstraint.isActive = false
}

func hideView() {
    optionalView.isHidden = true
    viewIsVisibleConstraint.isActive = false
    viewIsHiddenConstraint.isActive = true
}

此外,要修复故事板中的错误,您需要取消选中这些约束之一的已安装复选框。UIStackView(iOS9)
另一个选项是将您的视图包装在UIStackView中。一旦视图被隐藏UIStackView将自动更新布局

朱阳曜
2023-03-14

在运行时添加或删除约束是一个可能影响性能的重量级操作。然而,有一个更简单的选择。

对于要隐藏的视图,设置宽度约束。将具有前导水平间隙的其他视图约束到该视图。

要隐藏,请将宽度约束的.constant更新为0.f。其他视图将自动向左移动到假定位置。

有关更多详细信息,请参见我的其他答案:

如何在运行时更改标签约束?

蒋骏
2023-03-14

这是可能的,但是你必须做一点额外的工作。有几个概念性的东西需要先解决:

  • 隐藏视图,即使它们不绘制,仍然参与自动布局,并且通常保留它们的框架,将其他相关视图留在它们的位置。
  • 当从其超级视图中删除视图时,所有相关的约束也会从该视图层次结构中删除。

在您的情况下,这可能意味着:

  • 如果将左视图设置为隐藏,则标签将保持不变,因为该左视图仍在占用空间(即使它不可见)。
  • 如果删除左视图,标签可能会受到模糊约束,因为标签的左边缘不再具有约束

你需要做的是明智地过度限制你的标签。保留您现有的约束(另一个视图的10点空间),但添加另一个约束:使用非必需的优先级使您的标签的左边缘远离其Superview的左边缘10点(默认的高优先级可能会工作得很好)。

然后,当您希望它们向左移动时,请完全删除左视图。左视图的强制10pt约束将随其相关的视图一起消失,并且您将只剩下一个高优先级约束,即标签距离其超级视图10pt。在下一个布局过程中,这将导致它们向左扩展,直到它们填充superview的宽度,但边缘周围的间距除外。

一个重要的警告:如果您想要将左视图重新添加到图片中,不仅需要将其添加回视图层次,还需要同时重新建立其所有约束。这意味着您需要一种方法,在再次显示视图时,将视图与其标签之间的10pt间距约束放回原处。

 类似资料:
  • 我想在其中一个视图隐藏时制作可调整大小的视图。下面的链接已经针对iOS提出了这个问题。我想为Android制作。感谢任何帮助。我想在将可见性设置为隐藏计数和折扣后,为三个TextViev:position、stat_name、price添加空闲空间 我在这里的风格是:

  • 我有一个自定义视图CustomLayout(蓝色,自定义UIView),该视图包含3个子视图,通过使用约束(布局锚定)垂直对齐,每个视图按照以下顺序对齐: 1视图:幻灯片(红色,自定义UIView) 我想,当我单击按钮(黄色)时,如果使用动画打开,SlideLayout(红色)的高度大小会增加,如果关闭,则会减少。和其他视图必须在动画期间更改位置,如果SlideLayout增加/减少,则父视图(C

  • 我遇到了自动布局的问题,似乎无法找到应该很容易实现的答案。 我有以下视图层次结构: 标签上的前导/尾随限制使它们在更薄的设备上更高(iPhone 4s vs iPhone 6)。 为了让UIScrollview正常工作,我需要在UIScrollView内部设置UIView的高度约束,以避免出现“不明确的高度”警告。 但在iPhone 4s上运行时,UIView不够高,无法容纳它的子视图。 到目前为

  • 我有一个带有两个标签和一个小图像的表视图单元格。如果标签文本很短,则所有文本都放在一行中,如下所示: 但是,如果标签文本越来越长,图像和第二个标签应该移动到第二行: 我该如何使用自动布局来做到这一点? 第一个标签很简单 - 只需为左侧和顶部添加约束即可。标签始终只有一行,如果文本太长,标签会在中间被截断。 图像必须始终水平位于第二个标签(默认空间)的前面,并且两个标签都垂直居中。图像大小应与标签的

  • 问题内容: 在iOS 11中,a中的隐藏动画的行为已更改,但是我无法在任何地方找到该文档。 iOS 10 iOS 11 两者中的代码是这样的: 如何在iOS 11上还原以前的行为? 问题答案: 只是有同样的问题。该修复程序将添加到动画块中。您要隐藏的物品的容器在哪里? 不确定为什么这在iOS 11中突然成为一个问题,但公平地说,这一直是推荐的方法。

  • 在我的UITableViewCell中,我有两个UIView堆叠在一起。让我们称之为顶部和底部。 俯视图对superview具有前导、尾随和顶部约束。它的高度约束为20。 底部视图对superview具有前导、尾随和底部约束。它的高度约束为20。 顶部和底部具有垂直约束。 以编程方式“隐藏”底部视图(并使顶部视图接触超级视图的底部)的最简单方法是什么?我不想再创建任何约束,因为我确实在情节提要中设