我是iOS的新手,并且还不太了解Constraints。我正在为我的视图控制器添加一组动态视图,默认情况下包含一个scrollview和一个容器视图。一切正常,我正在设法使用以下内容将它们添加到彼此之下:
TheView.frame = CGRectMake(5, CGFloat(position), self.view.frame.size.width-10, 40); //position is incremented so that they are below each other
但是当我将手机转为横向时,视图不会占用主视图的宽度,所以我在视图中添加了以下内容:
TheView.translatesAutoresizingMaskIntoConstraints = false;
let margins = contentView.layoutMarginsGuide // contentView is the container view
TheView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true
TheView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true
这使得视图在旋转设备时动态地改变了它们的宽度,但它们现在重叠了,我似乎无法找出如何将它们设置为彼此低于它们的位置。
更新:
我从故事板中删除了scrollview和所有内容,并以编程方式添加了scrollview和堆栈视图。
在viewdidload中:
ScrollView = UIScrollView()
ScrollView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(ScrollView)
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": ScrollView]))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": ScrollView]))
stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.distribution = UIStackViewDistribution.EqualSpacing
stackView.spacing = 26.0
stackView.axis = .Vertical
ScrollView.addSubview(stackView)
ScrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))
ScrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))
添加动态视图:
for loop...
let Description = UILabel()
stackView.addArrangedSubview(Description)
let Value = UITextField()
stackView.addArrangedSubview(Value)
视图像以前一样成功添加,并且滚动。此外,视图正在填充堆栈视图(宽度)但仍然不在横向中。
答案 0 :(得分:3)
你不能同时:
frame
你要么做其中一个。
您似乎正在使用iOS 9 API constraintEqualToAnchor
,因此您可以将要堆叠的2个视图放入UIStackView
,这肯定是最简单的解决方案。
如果您需要支持旧版本的iOS(7,8),这只意味着您没有定义足够的约束来放置您的视图。
TheView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)
=>这个位置TheView
左侧(好吧,“领先”,因为它可以取决于所显示的语言的方向 - 例如,它适合阿拉伯语)
TheView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor)
限制另一方。
你有2个水平约束,所以你错过了2个其他约束,对于垂直轴。
其中一个约束可能是topAnchor
或bottomAnchor
(取决于TheView的位置 - 顺便说一句,UpperCase实例变量非常罕见:)
可以在TheView
和其他子视图之间定义另一个约束,例如
let viewTop = NSLayoutConstraint(item: TheView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Bottom, multiplier: 1, constant: 0)
,如果您想将TheView
置于scrollView
请注意UIScrollView
与自动布局的行为略有不同。
您必须为其提供一组具有其层次结构之外的视图的约束(以限制scrollview bounds
),您可以使用另一组约束来放置scrollView的子视图(这样,约束其contentSize
)(见Apple Technical Note on how to layout UIScrollView with constraints