自动布局和 UIScrollview 和子视图控制器问题

Posted

技术标签:

【中文标题】自动布局和 UIScrollview 和子视图控制器问题【英文标题】:Autolayout and UIScrollview and Child View Controller issues 【发布时间】:2015-05-12 16:00:23 【问题描述】:

在我的应用程序中,我有一个嵌入式子视图控制器,在运行时我必须根据来自服务器的数据添加一个或多个“编辑器 UIView”。我可以在 xib 文件中将每个“编辑器”建模为完整的 UIViewController 并在运行时添加它。 “编辑器”的父级有自己的一些项目(如标题和几个按钮),所以我尝试使用单个子 UIViewController 构建分层方法,并将“编辑器”动态加载到其 UIScrollview 中。但是我无法让 Autolayout 合作。该图显示了基本布置。

问题始于将“内容视图”嵌入到 UIScrollview 中。我可以让内容视图与滚动视图一起正常工作。当我添加编辑器视图并向内容视图添加运行时约束时,我收到多个自动布局投诉,而且滚动视图内容大小为 0,0,所以我显然没有得到我需要的东西。

关于如何解决这个问题的任何想法?我总是可以简单地为每个编辑器复制子控制器的额外项目,但是以这种分层方式进行这项工作会很好。

请注意,我首先使用 UITableViewController 执行此操作,其中每个编辑器都是 UITableViewCell 并且喜欢自动布局,但我想看看是否可以在没有表格的情况下执行此操作。也许我会回到那个。

在运行时添加这些:

_editor = [self editorForDataType];
[_contentView addSubview:_editor];

NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:_editor
                                                                  attribute:NSLayoutAttributeLeading
                                                                  relatedBy:0
                                                                     toItem:self.contentView
                                                                  attribute:NSLayoutAttributeLeft
                                                                 multiplier:1.0
                                                                   constant:0];
[self.contentView addConstraint:leftConstraint];

NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:_editor
                                                                   attribute:NSLayoutAttributeTrailing
                                                                   relatedBy:0
                                                                      toItem:self.contentView
                                                                   attribute:NSLayoutAttributeRight
                                                                  multiplier:1.0
                                                                    constant:0];
[self.contentView addConstraint:rightConstraint];

NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:_editor
                                                                  attribute:NSLayoutAttributeLeading
                                                                  relatedBy:0
                                                                     toItem:self.contentView
                                                                  attribute:NSLayoutAttributeTop
                                                                 multiplier:1.0
                                                                   constant:0];
[self.contentView addConstraint:topConstraint];

NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:_editor
                                                                   attribute:NSLayoutAttributeTrailing
                                                                   relatedBy:0
                                                                      toItem:self.contentView
                                                                   attribute:NSLayoutAttributeBottom
                                                                  multiplier:1.0
                                                                    constant:0];
[self.contentView addConstraint:bottomConstraint];

【问题讨论】:

您是否将 _editor 视图的 translatesAutoresizingMaskIntoConstraints 设置为 NO? 是的,虽然默认情况下似乎是 NO。 你是通过什么方法添加约束的? viewDidLoad? 是 viewDidLoad。我想知道这是否为时过早。 【参考方案1】:

最后,我需要的关键是以下一组约束,加上在viewDidLayoutSubviews 中添加编辑器视图的约束并为内容视图高度保存一个属性。

viewDidLoad 中,我将height 属性设置为编辑器视图的高度。现在效果很好。

【讨论】:

【参考方案2】:

您的最后两个约束不正确。你有从上到下和从上到下的尾随,这些应该是从上到下和从下到下的。但是,这些约束可能不是您想要的。如果它是第一个编辑器视图,您可能需要内容视图的顶部约束和高度约束。对于任何后续的,您应该将顶部固定到其上方的编辑器视图,而不是内容视图。

【讨论】:

我将约束移至viewDidLayoutSubviews 并遵循您的建议。现在,内容视图拥抱编辑器视图,它位于滚动视图的中心,这是出乎意料的。至少离得近一点。

以上是关于自动布局和 UIScrollview 和子视图控制器问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试理解 iOS 8 中的 UIScrollView 自动布局

自动布局和子视图

嵌入导航控制器时 Xcode 滚动视图自动布局问题?

空 UIView 上的自动布局约束无法按预期工作

自动布局 + UIScrollView 和单个子视图

具有动态视图数量和自动布局 iOS6 的 UIScrollView