ios - 隐藏互斥 subview 后调整容器 UIView 的大小以匹配可见 subview 的高度

标签 ios autolayout storyboard xib nslayoutconstraint

ParentView包含ChildView1和ChildView2。这些 subview 具有不同的高度。

ChildView1 比 ChildView2 高。仅显示一个 subview ,例如,如果 ChildView1 可见,则 ChildView2 隐藏。 ChildView1 和 ChildView2 都使用自定义 XIB。

两个 subview “驱动”ParentView 的高度,即自动布局约束的连接使得 ParentView 与 ChildView1 或 ChildView2 一样高,并且不会更高。

问题是隐藏 ChildView1 并显示 ChildView2 不会“缩小”ParentView 以匹配 ChildView2 的高度。它保持在较高 subview ChildView1 的高度。

调用 sizeToFit()setNeedsLayout() 不会改变任何事情。

当ChildView1隐藏时,如何强制ParentView匹配ChildView2的高度?

最佳答案

隐藏 View 仍然参与布局。除了隐藏隐藏 View 之外,您还需要停用对隐藏 View 的约束。

如果您的部署目标是 iOS 9 或更高版本,您可以将父级设置为 UIStackView。堆栈 View 在布局期间自动忽略其隐藏的 subview 。

更新

您不需要单独的 channel 来应对所有限制。您只需要两个奥特莱斯系列。您可以将一个 socket 集合连接到多个对象。演示:

creating outlet collections

集合最终连接到 Storyboard中的多个对象:

view controller connections

然后您可以使用一个语句激活或停用一组约束:

class ViewController: UIViewController {

    @IBOutlet var pinkConstraints: [NSLayoutConstraint]!
    @IBOutlet var greenConstraints: [NSLayoutConstraint]!

    func showPink() {
        NSLayoutConstraint.deactivateConstraints(greenConstraints)
        NSLayoutConstraint.activateConstraints(pinkConstraints)
    }

    func showGreen() {
        NSLayoutConstraint.deactivateConstraints(pinkConstraints)
        NSLayoutConstraint.activateConstraints(greenConstraints)
    }

}

关于ios - 隐藏互斥 subview 后调整容器 UIView 的大小以匹配可见 subview 的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36877915/

相关文章:

objective-c - 使用尺寸等级时无法加载 View

ios - 如何快速获取指向 View Controller 的全局指针

ios - 用两个 CGPoints SpriteKit Swift 创建一条线

ios - 使用 UIScrollView 自动布局

ios - 无法从 TableView 控制拖动到 Storyboard 中的详细 View

ios - 由于状态栏, View 未展开

ios - 如何防止 UIImageView 使用 Autolayout 调整大小

ios - 如何将 "identifier"提供给 Storyboard 中的 View Controller ?

ios - 收到错误 "Type ViewController does not conform to protocol ' UITableViewDataSource ...“即使我有所需的功能

c# - NSInvalidArgumentException 原因 - [xxxx 背景 View :willChangeToGraphicsQuality]