(自动布局)容器视图调整大小但子视图不调整大小

时间:2012-12-14 17:22:41

标签: ios uiview autolayout container-view

使用带有容器视图的自动布局时遇到一些问题(在两种情况下:使用ios5中使用的视图包含模式和简单的容器视图)。

我有一种自定义的Master Detail控制器,我可以在一些用户操作后重新调整左侧容器的大小,并且关联右侧控制器必须根据未使用的新空间调整大小。

对于“细节”控制器,我使用Xib设置控制器并使用自动布局我内部有一些视图。在视觉格式中他们会是这样的:

  • N:| [headerView] [内容查看] [footerView] |
  • H:| [headerVieW]
  • H:| [内容查看]
  • H:| [footerView]

这只是解决问题的一种表现形式。

如果我尝试调整detail controller.view框架的大小,则会正确扩展,但子视图不会。

在该控制器的 - (void)viewDidLayoutSubviews方法中我尝试手动设置框架并且可以正常工作但是我认为这不是正确的事情,因为我正在使用自动布局!

如果我有一个通用视图和包含图像视图的子视图,如果我使用autolayout从xib定义该视图,如果我在运行时在视图设置后更改框架子视图(图像视图为edample),则会再次出现此问题不要调整大小。

任何人都可以帮助我吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据您对约束的描述,我认为所描述的行为正是您告诉它的行为。

请注意,您的水平约束要求视图与其superviw的左侧齐平。然而,他们并没有说出他们应该如何与超级视图的右侧相关联。因此,改变superview的宽度不会做任何事情;他们只是保持与左边的大小齐平,并保持其内部约束提供的任何宽度。

如果您希望视图使用超级视图调整大小,则需要在尾部添加约束。具体来说,您的约束可能如下所示:

H:|[headerView]|
H:|[contentView]|
H:|[footerView]|

或者你可能希望它们只在超级视图过于狭窄时缩小,否则不会一直延伸到它。然后你可以这样做:

H:|[headerView]-(>=10)-|
H:|[contentView]-(>=10)-|
H:|[footerView]-(>=10)-|

无论如何,你的问题的根源似乎是视图没有以任何方式绑定到superview的右边缘,而且这与任何方式的宽度无关。添加这些约束应该可以解决问题。

答案 1 :(得分:0)

如果您的视觉格式中的观看次数介于" |" (这是你的情况)

CGSize fittingSize = [container systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
container.frame = CGRectMake(0, 150, 320, fittingSize.height);