使用addChild时translatesAutoresizingMaskIntoConstraints的异常行为疑问
UINavigationController的特殊布局逻辑
UINavigationController作为系统级容器控制器,内部对自身view的布局做了专属处理:即使translatesAutoresizingMaskIntoConstraints保持默认的true,当它被作为子控制器添加到父容器时,会自动将自身view的尺寸适配到父容器的bounds。这是因为UINavigationController的设计定位就是作为页面容器,系统内置了这种自动适配逻辑,无需开发者额外配置约束,所以你看到它能正常显示。
UITableViewController的差异原因
直接添加UITableViewController作为子控制器时,它的view没有这种容器级的自动适配机制。当translatesAutoresizingMaskIntoConstraints为true时,系统会根据view的autoresizing mask生成约束,但如果父容器没有明确设置frame或对应的约束,这些自动生成的约束无法确定view的有效尺寸,最终导致view的frame变成(0,0,0,0),页面空白。只有将该属性设为false,手动添加让tableView与父容器四边对齐的约束,才能让view正常显示。
关于你观察到的属性值
你打印UINavigationController的view的translatesAutoresizingMaskIntoConstraints为true是完全正确的,这是系统默认值。但UINavigationController在被添加为子控制器的流程中,内部会隐式完成自身view与父容器的布局绑定,所以无需修改这个属性也能正常工作。
内容的提问来源于stack exchange,提问作者Bob de Graaf

