Ios 带定位点的自动布局页边距

Ios 带定位点的自动布局页边距,ios,cocoa-touch,autolayout,nslayoutconstraint,Ios,Cocoa Touch,Autolayout,Nslayoutconstraint,所以,我认为以下是等效的 # This is how I usually do contentView.leftAnchor.constraint(equalTo: leftAnchor, constant: 5).isActive = true contentView.topAnchor.constraint(equalTo: topAnchor, constant: 5).isActive = true contentView.rightAnchor.constraint(equalTo:

所以,我认为以下是等效的

# This is how I usually do
contentView.leftAnchor.constraint(equalTo: leftAnchor, constant: 5).isActive = true
contentView.topAnchor.constraint(equalTo: topAnchor, constant: 5).isActive = true
contentView.rightAnchor.constraint(equalTo: rightAnchor, constant: -5).isActive = true
contentView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -5).isActive = true

# This is what I tried. I expected the same result..
layoutMargins = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
contentView.leftAnchor.constraint(equalTo: layoutMarginsGuide.leftAnchor).isActive = true
contentView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
contentView.rightAnchor.constraint(equalTo: layoutMarginsGuide.rightAnchor).isActive = true
contentView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor).isActive = true
虽然我似乎错了。如何使用边距、约束和锚定在containerView和父级之间获得5个边距?

Objective-C:

[contentView.leftAnchor constraintEqualToAnchor:contentView.superview.leftAnchor constant:5].active = YES;
[contentView.rightAnchor constraintEqualToAnchor:contentView.superview.rightAnchor constant:5].active = YES;
[contentView.topAnchor constraintEqualToAnchor:contentView.superview.topAnchor constant:5].active = YES;
[contentView.bottomAnchor constraintEqualToAnchor:contentView.superview.bottomAnchor constant:5].active = YES;
Swift 3:

contentView.leftAnchor.constraint(equalTo: contentView.superview?.leftAnchor, constant: 5).isActive = true
contentView.rightAnchor.constraint(equalTo: contentView.superview?.rightAnchor, constant: 5).isActive = true
contentView.topAnchor.constraint(equalTo: contentView.superview?.topAnchor, constant: 5).isActive = true
contentView.bottomAnchor.constraint(equalTo: contentView.superview?.bottomAnchor, constant: 5).isActive = true

我通过阅读以下问题找到了解决方案:

init
设置
layoutMargins
时,似乎存在问题

尽管如此,我没有在
viewdimovetosuperview
中设置
layoutMargins
,而是将其放在
updateConstraints
中,这也很有效

因此,代码现在是:

override init(frame: CGRect) {
    super.init(frame: frame)
    contentView.leftAnchor.constraint(equalTo: layoutMarginsGuide.leftAnchor).isActive = true
    contentView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
    contentView.rightAnchor.constraint(equalTo: layoutMarginsGuide.rightAnchor).isActive = true
    contentView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor).isActive = true
}

override func updateConstraints() {
    super.updateConstraints()
    layoutMargins = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
}
其效果与:

contentView.leftAnchor.constraint(equalTo: leftAnchor, constant: 5).isActive = true
contentView.topAnchor.constraint(equalTo: topAnchor, constant: 5).isActive = true
contentView.rightAnchor.constraint(equalTo: rightAnchor, constant: -5).isActive = true
contentView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -5).isActive = true

似乎在
updateConstraints()
中设置
layoutMargins
是可行的,但需要注意以下几点:

override func updateConstraints() {
    super.updateConstraints()
    layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
}
上述代码将无法更新边距,因为新值与系统默认值相同。为了安全起见,首先将边距重置为零:

override func updateConstraints() {
    super.updateConstraints()
    layoutMargins = .zero
    layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
}

另外,如果您的目标是将初始边距设置为
.zero
,那么最好先将其设置为非零值,以确保视图收到更改通知。

如果您阅读了问题,您会发现这正是您所说的我现在正在做的事情,我想知道如何让它与layoutMarginGuides一起工作,而不是确定它在这种情况下是否重要,但一般来说,应该在实现结束时调用
super.updateConstraints()