在代码中创建这些约束,需要建议
Posted
技术标签:
【中文标题】在代码中创建这些约束,需要建议【英文标题】:Creating these constraints in code, advice required 【发布时间】:2014-01-04 02:53:24 【问题描述】:所以我很难理解如何创建界面构建器为我创建的相同约束。
我一直在阅读苹果开发者网站上的文档并尝试关注它,但我似乎无法完成这些工作。我正在创建一个自定义视图控制器,它添加一个子视图并在新视图被推入时为其创建相同的约束。(底部约束是新视图被推送的位置,顶部视图总是相同的)我已经写了以下代码,但它似乎无法正常工作(例如,当我模拟通话状态栏时,视图的行为与 IB 创建约束的初始视图不同)
我的代码:
QVViewController * __weak vc1 = (QVViewController*)self.rootViewController2.parentViewController;
UIView *viewToBePushed = tempV.view;
UIView *topContainerView = self.rootViewController1.view;
id bottomLayoutGuide = tempV.bottomLayoutGuide;
[vc1.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[viewToBePushed]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(viewToBePushed)]];
[vc1.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topContainerView]-0-[viewToBePushed]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(viewToBePushed,topContainerView)]];
[vc1.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-138-[viewToBePushed]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(viewToBePushed)]];
[vc1.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[viewToBePushed]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(viewToBePushed)]];
[vc1.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[viewToBePushed]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(viewToBePushed)]];
[vc1.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bottomLayoutGuide]-0-[viewToBePushed]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(viewToBePushed, bottomLayoutGuide)]];
基本上
viewToBePushed 表示图片中的底部容器 topContainerView 代表图片中最顶层的容器 vc1 是这两个容器所在的视图
我希望我把情况解释得足够清楚,如果没有,请询问,我可以尝试详细说明。我将非常感谢您的帮助,因为这些限制因素正在偷走我的晚安,我非常想编写易于维护的代码。
那么有人可以告诉我如何在代码中正确创建这些约束。
【问题讨论】:
当您说视图的行为不像 IB 约束时那样,您具体看到了什么?顺便说一句,第一行和第五行的约束是多余的,因为第四行约束已经将 viewToBePushed 绑定到父视图的两侧,长度为 0。 如果 IB 创建的约束满足您的需求,那么除了学习之外,无需在代码中创建它们。如果 IB 创建的约束有效,您可以创建 IBOutlet 属性,以便在需要的代码中简单地调整它们。 @uchuugaka 图片中的视图是我的自定义 splitview 控制器的根视图,IB 为其创建了约束。当我推入一个新视图时,它会覆盖旧视图。我希望新视图也具有相同的约束,因此它的大小应该正确。 @rdelmar 它抱怨的第一件事是最后一个约束不适用于我跟踪为底部容器视图的底部约束的其他一些约束。两个视图不能同时有bottomLayoutGuide相关的约束吗? 不清楚您要完成什么。您在视图控制器中有两个容器视图。底部容器视图中嵌入了什么,它只是视图控制器还是导航控制器?您如何在底部容器视图中的控制器之间切换? 【参考方案1】:鉴于您的设置,我认为底部容器视图应该具有您需要的任何约束,但它们永远不需要更改。当您切换到嵌入在该容器视图中的新控制器时,您只需对该容器的所有侧面设置约束(在将 viewThatWasPushed 添加为子视图之后)
[self.bottomContainerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[viewThatWasPushed]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewThatWasPushed)]];
[self.bottomContainerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[viewThatWasPushed]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewThatWasPushed)]];
self.bottomContainerView 是一个 IBOutlet 到 theta 底视图。
【讨论】:
以上是关于在代码中创建这些约束,需要建议的主要内容,如果未能解决你的问题,请参考以下文章
IOS/Autolayout:在生命周期中为代码中创建的元素设置约束
IOS / Autolayout:在生命周期中为代码中创建的元素设置约束