我有一個使用 superview 的 centerXAnchor 放置在中心的按鈕,但現在我必須將按鈕的位置從 centerX 更改為對齊代碼的前導。但是,它不會向左移動。相反,它獲得全寬按鈕。
buttonView!.translatesAutoresizingMaskIntoConstraints = false
buttonView!.removeConstraints(buttonView!.constraints)
NSLayoutConstraint.activate([
buttonView!.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 12),
buttonView!.bottomAnchor.constraint(equalTo: mainView.bottomAnchor, constant: 20),
])
uj5u.com熱心網友回復:
洗掉/添加約束不會導致它們被(重新)應用。
呼吁.setNeedsUpdateConstraints()你的看法。然后系統將呼叫updateConstraints作為其下一個布局傳遞的一部分。對于復雜的約束場景,您可能需要自己實作updateConstraints,但在大多數情況下,絕對是您的,這將是不需要的(除非有特定原因使用它,否則通常應避免使用它 - 請參閱檔案)
uj5u.com熱心網友回復:
首先洗掉所有約束
extension UIView {
public func removeAllConstraints() {
var _superview = self.superview
while let superview = _superview {
for constraint in superview.constraints {
if let first = constraint.firstItem as? UIView, first == self {
superview.removeConstraint(constraint)
}
if let second = constraint.secondItem as? UIView, second == self {
superview.removeConstraint(constraint)
}
}
_superview = superview.superview
}
self.removeConstraints(self.constraints)
self.translatesAutoresizingMaskIntoConstraints = true
self.setNeedsUpdateConstraints()
}
}
使用它
DispatchQueue.main.async { [weak self] in
self?.buttonView.removeAllConstraints()
// then you can add your constraint as you like
}
參考
uj5u.com熱心網友回復:
有多種方法可以做到這一點,具體取決于您需要完成的任務。
首先,你說你在 Storyboard 中展示你的觀點,所以......
如果我們談論的是一個(或幾個)特定視圖,我們可以@IBOutlet為您想要更改的約束創建變數。
在故事板中:
- 給你的 buttonView 一個 centerX 約束,用
Priority: Required (1000) - 給你的 buttonView 你想要的領先約束,用
Priority: Low (250)
將它們連接到插座:
@IBOutlet var buttonCenterConstraint: NSLayoutConstraint!
@IBOutlet var buttonLeadingConstraint: NSLayoutConstraint!
然后,從居中切換到領先:
buttonCenterConstraint.priority = .defaultLow
buttonLeadingConstraint.priority = .required
您可以將其“切換”回居中:
buttonLeadingConstraint.priority = .defaultLow
buttonCenterConstraint.priority = .required
也許對 centerY 和 bottom 約束做同樣的事情。
如果你想要更多的“靈活性”,你可以這樣做:
- 在情節提要中,僅設定 centerX 約束
然后,將其更改為主要約束:
// find the centerX constraint and de-activate it
if let cxConstraint = mainView.constraints.first(where: { ($0.firstAttribute == .centerX && $0.firstItem === buttonView) }) {
cxConstraint.isActive = false
} else if let cxConstraint = mainView.constraints.first(where: { ($0.firstAttribute == .centerX && $0.secondItem === buttonView) }) {
cxConstraint.isActive = false
}
// add a new leading constraint
buttonView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor, constant: 12.0).isActive = true
您也可以使用其他人建議的擴展來“洗掉所有約束”......但您可能會洗掉您不想更改的約束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530033.html
