自动布局和 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 和子视图控制器问题的主要内容,如果未能解决你的问题,请参考以下文章