嵌入在程序化UIView中的自动布局XIB没有调整到父级

时间:2014-10-06 23:57:21

标签: ios objective-c uiview autolayout

我有一个xib文件,表示我使用[[NSBundle mainBundle] loadNibNamed:@"name"][0]实例化的自动布局的简单视图,并通过UIView添加到以编程方式创建的addSubview:

问题是视图没有拉伸以满足嵌入视图的大小;相反,它似乎默认为xib文件中指定的大小。 (我也找不到任何方法在xib文件中设置容器视图本身的约束,只有它的子视图。)

同样奇怪的是,当我旋转iPad时,视图的宽度会进一步缩小。所以它显然是以某种方式连线,但是错误的初始值。

我缺少什么连接才能使这个嵌入式视图正确适合视图层次结构?

屏幕截图(为调试添加品红色):

screenshot 1

旋转到肖像后:

screenshot 2

1 个答案:

答案 0 :(得分:18)

它没有调整自身以填补其新的超级视图的原因是你没有安排它来做到这一点。简而言之,您需要在代码中添加约束,以便在将两个视图添加到另一个视图之后关联它们。

最有可能的是,IB将视图设置为将其自动调整遮罩转换为约束。当NIB设置为使用自动布局时,很难确定它的自动调整掩码是什么。

无论如何,当您将其添加到superview时,自动生成的约束将保持其当前帧。当superview调整大小时,他们会根据自动调整大小调整大小(可能允许宽度和高度变化,但不能改变到超视图边缘的距离)。

当您使用自动布局时,您应该执行以下操作:

  • 要么关闭NIB中的translatesAutoresizingMaskIntoConstraints ,请在将其添加到超级视图的代码中将其关闭。您采用哪种方法取决于您是否预期视图将作为管理其子视图布局的框架视图类的子视图添加。如果你愿意,那么你应该把它留在NIB中,让那个班级决定是否关掉它。

  • 将视图添加到其超级视图后,向超级视图添加约束,以控制视图的布局位置。