以编程方式显示和隐藏容器UIView及其子视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式显示和隐藏容器UIView及其子视图相关的知识,希望对你有一定的参考价值。

我有一个标签和一个按钮并排,如下所示:

enter image description here

这是由以下代码创建的:

private func addViewBack() {
    myLabel.translatesAutoresizingMaskIntoConstraints = false
    myLabel.text = "Show my label"

    myButton.addTarget(self, action: #selector(pressed), for: .touchUpInside)
    myButton.setTitleColor(UIColor.lightGray, for: UIControl.State.normal)
    myButton.translatesAutoresizingMaskIntoConstraints = false
    myButton.setTitle("Button", for: .normal)
    myButton.clipsToBounds = true

    containerView.backgroundColor = .red
    containerView.addSubview(myLabel)
    containerView.translatesAutoresizingMaskIntoConstraints = false
    containerView.addSubview(myButton)

    containerView.addConstraint(NSLayoutConstraint(item: myButton, attribute: .centerY, relatedBy: .equal, toItem: myLabel, attribute: .centerY, multiplier: 1, constant: 0))
    containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-8-[myLabel]-8-|", options: [], metrics: nil, views: ["myLabel":myLabel]))
    containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-8-[myLabel]", options: [], metrics: nil, views: ["myLabel":myLabel]))
    containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[myButton]-8-|", options: [], metrics: nil, views: ["myButton":myButton]))
    containerView.layoutIfNeeded()

    self.view.addSubview(containerView)

    self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[topView]-100-[containerView]", options: [], metrics: nil, views: ["containerView":containerView,"topView":viewTop]))
    self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-8-[containerView]-8-|", options: [], metrics: nil, views: ["containerView":containerView]))
    self.view.layoutIfNeeded()
}

我有按下按钮时显示和隐藏容器视图的显示和隐藏按钮,如下所示:

@IBAction func show(_ sender: Any) {

    if let constraint = (containerView.constraints.filter{$0.firstAttribute == .height}.first) {
        constraint.isActive = false
    }

    containerView.layoutIfNeeded()
}

@IBAction func hide(_ sender: Any) {
    containerView.heightAnchor.constraint(equalToConstant: 0).isActive = true
    containerView.layoutIfNeeded()

}

当使用隐藏动作时,按钮永远不会被隐藏,我最终会得到这样的结果:

enter image description here

当我添加以下内容时,它可以工作:

@IBAction func hide(_ sender: Any) {
    containerView.heightAnchor.constraint(equalToConstant: 0).isActive = true
    myButton.heightAnchor.constraint(equalToConstant: 0).isActive = true
    containerView.layoutIfNeeded()

}

当我按下show动作时,按钮永远不会再次出现,如下所示:

enter image description here

如何以编程方式使用自动布局非常简单地在容器视图中显示和隐藏元素?

答案

不要使容器视图高度约束处于活动/非活动状态,而是将其常量更改为零以隐藏容器视图。如果它的clipsToBounds为真,那也会隐藏内容。

以上是关于以编程方式显示和隐藏容器UIView及其子视图的主要内容,如果未能解决你的问题,请参考以下文章

在以编程方式创建的 UIView 层次结构之上添加子视图

UIView 未以编程方式显示在 UIScrollView 中

以编程方式创建视图与 IB 相比的效率

检测关于容器视图的 UIView 中心位置 - Swift - 以编程方式

如何更新 UIView 的图层属性并为其子视图保留图层?

使用 nscoding 归档 UIVIew 及其子视图