UIView以编程方式设置约束

时间:2015-12-15 08:30:33

标签: ios swift uiscrollview nslayoutconstraint ios-autolayout

我是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)

视图像以前一样成功添加,并且滚动。此外,视图正在填充堆栈视图(宽度)但仍然不在横向中。

1 个答案:

答案 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个其他约束,对于垂直轴。

其中一个约束可能是topAnchorbottomAnchor(取决于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