使用Autolayout时应该在哪里手动添加子视图

Where should I manually add subviews when using Autolayout

我试图强迫自己开始在所有地方使用 AutoLayout。我有一个使用框架非常简单的场景,但我无法使用 Autolayout 使其工作。

我有一个 StoryBoard,我不能碰它,因为它属于图书馆。当与故事板相关的 ViewController 加载时,我想以编程方式添加一个视图。所以我在 viewDidLoad 中创建了一个 UIView,添加了高度和宽度的约束以及另外两个约束来定位它们。一切都很好,但宽度,我想要与其他视图具有相同的宽度。我应该怎么做?

我在viewDidLoad中记录了"other view"的大小,但大小不对,我也记录了self.view.frame.size.width,也不正确。

我读到直到 viewDidLayoutSubviews 才设置正确的大小,所以我尝试在那里添加我的代码,但我陷入了对 viewDidLayoutSubviews 的调用循环,该循环永远不会结束。我做错了什么?

尝试将代码放入 viewDidAppear。检查子视图是否已经是视图的后代,如果不是,则添加带有约束的子视图。

UIViewController的这个方法你肯定可以用,

- (void)updateViewConstraints 
{
   [super updateViewConstraints] ;

   // now update your subviews contraints or log your view sizes

}

由于您正在使用基于约束的布局并希望根据 UIViewController 的约束更新子视图约束,因此您应该始终使用以下方法。

如果您希望两个视图具有相同的宽度,您应该使用 constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:。您可以在 viewDidLoad 中执行此操作。

NSLayoutConstraint *widthCon = [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeWidth relatedBy: NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeWidth multiplier:1 constant:0];

这假定来自库情节提要的视图是使用约束创建的。