在UIScrollView中,具有视觉格式的NSLayoutConstraints无法按预期工作吗?

时间:2018-09-03 02:02:36

标签: ios swift

我将UILabel放在UIScrollView内,我想在标签上添加以下约束:

  1. 上边距是20

  2. 左边距为20

  3. 右边距为20

  4. 标签的高度为40

这是我使用视觉格式为这些约束编写的代码:

let label = UILabel.init(frame: .zero)
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "Some Text"
scrollView.addSubview(label)

let horizontalConstraints = NSLayoutConstraint.constraints(
    withVisualFormat: "H:|-20-[label]-20-|",
    options: [],
    metrics: nil,
    views: ["label": label]
)

let verticalConstraints = NSLayoutConstraint.constraints(
    withVisualFormat: "V:|-20-[label(40)]",
    options: [],
    metrics: nil,
    views: ["label": label]
)

NSLayoutConstraint.activate(horizontalConstraints + verticalConstraints)

但是我得到的是this picture(由于我的声誉低,所以无法上传照片)。我在视图中添加了边框,蓝色的是UIScrollView的边框,红色的是UILabel的边框

2 个答案:

答案 0 :(得分:0)

您的代码不正确。这是代码的外观。而且,如果您使用这种添加约束的方式,则无需使用特殊方法来激活约束。这些垂直和水平约束已经激活。

//horizontal constraints
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[v0]-20-|", 
options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": label]))

//vertical constraints
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-20-[v0(40)]", 
options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": label]))

语法说明:

"H", "V"-水平,垂直约束

"|"-锚点,例如"H:|[v0]"-左锚点

"-20-"-偏移量,例如“ V:| -20- [v0]”-偏移量为20的顶部锚点

"[v0(40)]"-这是视图的大小,例如"V:[v0(40)]"-高度为40

"[v0]"-您的第一个视觉格式视图。这种格式可以为多个视图设置约束。

例如:

(格式:“ V:| -16- [v0] -8- [v1(44)]-16- [v2(1)] |”,视图:[“ v0”:firstView],[“ v1 “:secondView],[” v2“:thirdView])

答案 1 :(得分:0)

我想通了。尽管我不知道为什么会这样,但无论是UIScrollView的错误还是只是需要用这种方式完成。

显然,当将子视图添加到故事板中的UIScrollView时,您总是会收到一条警告,指出子视图的位置不明确。因此,您要做的是向滚动视图中添加一个UIView并向其中添加这些约束:

  1. 顶部= 0,领先= 0,尾随= 0,底部= 0

  2. UIView在滚动视图中水平和垂直居中

在那之后,最好将子视图添加到UIView而不得到那些警告。

同样的原因在这里适用,当您要以编程方式向UIScrollView添加子视图并设置一些约束时,应在滚动视图中放置UIView并将所有子视图置于{ {1}}:

UIView

完成这四个步骤后,现在可以将子视图添加到“ subviewContainer”中。