Container view with dynamic height inside UIScrollView with auto layout

前端 未结 3 1474
灰色年华
灰色年华 2021-02-02 15:03

I have a UIScrollView, nested inside of which in one content view and it has two child views nested, a regular UIView with a known height, and a container view with dynamic heig

3条回答
  •  时光说笑
    2021-02-02 15:43

    There were two things I found that helped me work around this same issue.

    Issue 1: Height of Container

    I want the container view to resize itself, but IB wants an explicit height on the container view. Since IB doesn't know anything about the content of the view, it has no way of knowing the content of the container view can size itself. The simplest way to do that is to set a Placeholder Intrinsic Content Size from the Size Inspector for the container view:

    Size Inspector

    This effectively results in making IB happy without applying any height constraint. Another option is to add a "Remove at build time" height constraint on the container.

    Issue 2: Height of Child View Controller View

    The root view of the child view controller defaults to using an AutoresizingMask, as is standard for the topmost view in any UIViewController. My solution to this is to disable use of AutoresizingMask in prepareForSegue, when the child view controller is added. Try the following in the parent view controller:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)
    
        if let childViewController = segue.destination as? ChildViewControllerClass {
            childViewController.view.translatesAutoresizingMaskIntoConstraints = false
        }
    }
    

    Making the change in the parent view ensures that if the child view is re-used elsewhere inside a UINavigationController, the view will be sized correctly.

    Before I made that change, I kept getting AutoLayout errors conflicting with constraints called UIView-Encapsulated-Layout-Height, which I believe is the name for constraints derived from AutoresizingMask based layout on the root UIViewController view.

提交回复
热议问题