以编程方式添加负约束
Adding negative constraints programmatically
为什么我必须为 titleLabel
的 rigthAnchor
约束赋予负值才能使视图右侧的边距为 28。如果我只是给它一个正值,它就会超出视图 28 个像素。
private func setupLayout() {
view.addSubview(imageView)
view.addSubview(titleLabel)
// *** imageView ***
if #available(iOS 11.0, *) {
imageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 116).isActive = true
} else {
imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 116).isActive = true
}
imageView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
imageView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
imageView.heightAnchor.constraint(equalToConstant: 224).isActive = true
// *** titleLabel ***
titleLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 25).isActive = true
titleLabel.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -28).isActive = true
titleLabel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 28).isActive = true
}
因为根据这个
titlelbl.right = view.right - 28
等于说
view.right = titlelbl.right + 28
firstItem.anchor = seconfItem.anchor * multiplier +/- constant
转换为
titleLabel.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -28).isActive = true
或
view.rightAnchor.constraint(equalTo: titleLabel.rightAnchor, constant: 28).isActive = true
如果你不喜欢负值
编辑:
约束为 -28 时的含义
您要告诉自动布局将 titlbl 的最大 x 值设置为等于视图的最大 x 值减去 28
| - lbl + 28 - |
但 +28
| - lbl - | + 28 <<< out of view max x
我认为这与 window 的 (X,Y) 网格有关。
您正在将 titleLabel 的 rightAnchor 锚定到视图的 rightAnchor。但是,如果'you're constant 是 28,则您将沿 x 轴约束该锚点 28 个点,从而将您的标签移出视图的框架。
如果您以编程方式添加这些约束,则必须将常量指定为负数,以便沿 x 轴向左移动。
为什么我必须为 titleLabel
的 rigthAnchor
约束赋予负值才能使视图右侧的边距为 28。如果我只是给它一个正值,它就会超出视图 28 个像素。
private func setupLayout() {
view.addSubview(imageView)
view.addSubview(titleLabel)
// *** imageView ***
if #available(iOS 11.0, *) {
imageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 116).isActive = true
} else {
imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 116).isActive = true
}
imageView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
imageView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
imageView.heightAnchor.constraint(equalToConstant: 224).isActive = true
// *** titleLabel ***
titleLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 25).isActive = true
titleLabel.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -28).isActive = true
titleLabel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 28).isActive = true
}
因为根据这个
titlelbl.right = view.right - 28
等于说
view.right = titlelbl.right + 28
firstItem.anchor = seconfItem.anchor * multiplier +/- constant
转换为
titleLabel.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -28).isActive = true
或
view.rightAnchor.constraint(equalTo: titleLabel.rightAnchor, constant: 28).isActive = true
如果你不喜欢负值
编辑:
约束为 -28 时的含义
您要告诉自动布局将 titlbl 的最大 x 值设置为等于视图的最大 x 值减去 28
| - lbl + 28 - |
但 +28
| - lbl - | + 28 <<< out of view max x
我认为这与 window 的 (X,Y) 网格有关。
您正在将 titleLabel 的 rightAnchor 锚定到视图的 rightAnchor。但是,如果'you're constant 是 28,则您将沿 x 轴约束该锚点 28 个点,从而将您的标签移出视图的框架。
如果您以编程方式添加这些约束,则必须将常量指定为负数,以便沿 x 轴向左移动。