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
There were two things I found that helped me work around this same issue.
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:
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.
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.