UIViewController addChild 和 translatesAutoresizingMaskIntoConstraints

UIViewController addChild and translatesAutoresizingMaskIntoConstraints

提问人:Bob de Graaf 提问时间:8/29/2023 最后编辑:Bob de Graaf 更新时间:8/30/2023 访问量:57

问:

在使用 addChild 时,我看到一些关于 translatesAutoresizingMaskIntoConstraints 的奇怪行为。

我以编程方式创建了一个 UITableViewController,将其放入 UINavigationController 中,也是以编程方式创建的,因此不涉及情节提要或类似内容。然后,当我小时候添加导航控制器时,一切都很完美。请看我使用的代码:

    //Add Child View Controller
    self.addChild(viewController)

    //Add Child View as Subview
    self.view.addSubview(viewController.view)
    
    print("TranslatesAutoresizingMaskIntoConstraints: \(viewController.view.translatesAutoresizingMaskIntoConstraints)")

    //Define Constraints
    NSLayoutConstraint.activate([
        viewController.view.topAnchor.constraint(equalTo: self.view.topAnchor),
        viewController.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
        viewController.view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
        viewController.view.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
    ])

    //Notify Child View Controller
    viewController.didMove(toParent: self)

    

然后我发现我实际上不需要 navigationController,所以我只是将我的 tableviewcontroller 本身添加为孩子。突然,它不再起作用了,我看到了一个空屏幕。我打印出框架,它是 0,0,0,0。 然后,我想起当我使用'NSLayoutConstraint.activate'时,我需要将'translatesAutoresizingMaskIntoConstraints'设置为false。

所以我做到了,而且,正如我所期望的那样,它又起作用了。但这对我来说很奇怪,因为据我所知,UINavigationControllers 并没有自动将 translatesAutoresizingMaskIntoConstraints 设置为 false。因此,我将其放回导航控制器中并打印出 translatesAutoresizingMaskIntoConstraints 的值,令我惊讶的是,显示的值显示它已设置为 true!但不知何故,它仍然有效,我完美地看到了 tableviewcontroller!

我还在 viewDidAppear 和其他地方打印了 translatesAutoresizingMaskIntoConstraints 的值,但打印的值在任何地方都是真实的。 UINavigationController 会在某个地方神奇地做一些事情吗?

Swift UIVieviceController UIAnageController 情节提要

评论

0赞 Sweeper 8/29/2023
您应该为 3 和 4 显示一个最小的可重现示例。是否还向情节提要中的视图添加了约束?如果没有,我不明白为什么这是出乎意料的。
0赞 Bob de Graaf 8/29/2023
@Sweeper感谢您的回复。我可以创建一个最小的例子,但我希望我只是遗漏了一些东西。至于故事板,不,我没有做任何限制。但是为什么说这是你所期望的呢?我以为故事板会自动将其设置为 false,但显然,当我打印出来时,情况并非如此。但它仍然以某种方式起作用......
0赞 Sweeper 8/29/2023
只需在添加 AutloLayout 约束时为 false。默认情况下为 true,当您在 Storyboard 上添加约束时,Storyboard 会将其设置为 false。如果没有约束,则为 true。translatesAutoresizingMaskIntoConstraintstranslatesAutoresizingMaskIntoConstraints
0赞 Bob de Graaf 8/29/2023
但是我确实添加了约束,正如您在我的代码中看到的那样。
0赞 Sweeper 8/29/2023
我以为我们在谈论故事板?您是否同时使用两者?这就是为什么一个最小的可重复的例子很重要。

答: 暂无答案