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

Posted

技术标签:

【中文标题】(自动布局)容器视图调整大小但子视图不【英文标题】:(auto layout) container view resizes but subviews don't 【发布时间】:2012-12-14 17:22:41 【问题描述】:

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

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

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

V:|[headerView][contentView][footerView]| H:|[headerView] H:|[内容视图] H:|[页脚视图]

这只是一种不理解问题的表示。

如果我尝试调整细节 controller.view 框架的大小,它会正确展开,但子视图不会。

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

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

谁能帮帮我?

谢谢!

【问题讨论】:

这个有什么用?似乎很多人都遇到了类似的问题,但没有找到解决方案! 【参考方案1】:

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

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

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

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

或者您可能希望它们仅在超级视图太窄时收缩,否则不要一直延伸到它上面。然后你可以这样做:

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

无论如何,您的问题的根源似乎是视图不以任何方式绑定到超级视图的右边缘,并且这不以任何方式绑定到其宽度。添加这些约束应该可以解决问题。

【讨论】:

【参考方案2】:

如果您在视觉格式中的视图介于“|”之间(这是你的情况)

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

【讨论】:

以上是关于(自动布局)容器视图调整大小但子视图不的主要内容,如果未能解决你的问题,请参考以下文章

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

iOS:使用自动布局保持视图彼此按比例调整大小

UINavigationController 不使用自动布局 iOS 8 更新大小

在不自动调整大小的情况下确定 UIView 容器大小

自定义视图不使用自动布局调整大小

使用固定大小的子视图和自动布局调整 UIView 的大小不起作用