【问题标题】:Resize container UIView to match height of visible subview after hiding mutually exclusive subview隐藏互斥子视图后,调整容器 UIView 的大小以匹配可见子视图的高度
【发布时间】:2016-08-21 01:09:34
【问题描述】:

ParentView 包含 ChildView1 和 ChildView2。这些子视图的高度不同。

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

两个子视图都“驱动”了 ParentView 的高度,即 AutoLayout 约束的连接方式是使 ParentView 与 ChildView1 或 ChildView2 一样高,而不是更高。

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

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

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

【问题讨论】:

    标签: ios autolayout storyboard xib nslayoutconstraint


    【解决方案1】:

    隐藏视图仍然参与布局。除了隐藏它之外,您还需要停用隐藏视图上的约束。

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

    更新

    您不需要为所有约束设置单独的插座。您只需要两个出口系列。您可以将一个插座集合连接到多个对象。演示:

    集合最终连接到情节提要中的多个对象:

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

    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)
        }
    
    }
    

    【讨论】:

    • 感谢您的建议!但是按照路飞的建议更新父母的框架也可以吗?如果是这样,这种方法似乎更好,因为您不需要在隐藏视图上为每个约束创建出口(有四个“驱动”超级视图的高度)。
    • 这取决于父级是否设置了translatesAutoresizingMaskIntoConstraints
    • 如果使用路飞的方法,值应该是多少?在你们回答之前使用的解决方案是在父视图和子视图之间插入另一层,以便子视图驱动其中间层的视图而不是父视图。在这三种方法(你的、路飞的和中间人的)中,你认为哪种方法最干净?再次感谢您的意见!
    • 什么决定了子视图的大小?
    • 它的子视图。 childview1 有大约 10 个不同的组件来驱动它的高度。 childview2 有 2 个。
    【解决方案2】:

    您可以将父视图设置为与子视图保持相同的大小

    // Match to childView1
    CGSize size = childView1.frame.size;
    [parentView setFrame:CGRectMake(0,0,size.width,size.height)];
    

    反之亦然

    // Match to childView2
    CGSize size = childView2.frame.size;
    [parentView setFrame:CGRectMake(0,0,size.width,size.height)];
    

    【讨论】:

      【解决方案3】:

      通过在 ParentView 和 ChildView1/ChildView2 之间插入中间视图解决了该问题。这样,ChildView1 正在驱动其包含视图的高度,而不是 ParentView,并且与 ChildView2 相同。也许不是最干净的,但它正在工作。 Rob 使用 UIStackView 的建议似乎很理想,但它只需要放弃对 iOS 8 的支持,这对于应用程序来说目前并不实用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 2014-09-02
        • 2013-04-12
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多