AutoLayout 不以编程方式更新视图 - Swift
AutoLayout not updating views programmatically - Swift
我有以下代码,我在其中创建和布置代码中的所有内容。我想要做的是在点击按钮时修改 myTopContainer
但我无法更改宽度,只能修改高度。
知道为什么吗?
func setupAutoLayout(){
NSLayoutConstraint.activate([
// My Container
myTopContainer.bottomAnchor.constraint(equalTo: myButton.topAnchor, constant: -5),
myTopContainer.heightAnchor.constraint(equalToConstant: 50),
myTopContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15),
myTopContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15),
// My Button
myButton.widthAnchor.constraint(equalToConstant: 80),
myButton.heightAnchor.constraint(equalToConstant: 40),
myButton.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -15),
myButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -400)
])
}
@IBAction func relayoutViews(_ sender: Any) {
UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseIn, animations: {
self.myTopContainer.heightAnchor.constraint(equalToConstant: 50).isActive = false
self.myTopContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 15).isActive = false
// this is working, it changes the height
self.myTopContainer.heightAnchor.constraint(equalToConstant: 10).isActive = true
// this is not doing anything
self.myTopContainer.leadingAnchor.constraint(equalTo: self.myButton.trailingAnchor).isActive = true
self.view.layoutIfNeeded()
})
}
像这样的一行
self.myTopContainer.heightAnchor.constraint(equalToConstant: 50).isActive = false
每次都创建一个新的约束。它不会修改之前创建的约束。
当您设置自动布局时,您应该在实际调用 NSLayoutConstraint.activate()
之前保存对您稍后要修改的约束的引用。
稍后您可以将它们的 isActive 设置为 false。
例如:
var someConstraint: NSLayoutConstraint?
func setupAutoLayout(){
let aConstraint = myTopContainer.bottomAnchor.constraint(equalTo: myButton.topAnchor, constant: -5)
someConstraint = aConstraint
NSLayoutConstraint.activate([
// My Container
aConstraint
])
}
func editConstraint() {
self.someConstraint?.isActive = false
}
无论如何,当你编辑约束时要小心日志,你可能会在编辑时破坏某些东西。如果您看到那些破坏约束的日志,则意味着仍然有问题(即使它在视觉上看起来不错,它也可能在其他情况下崩溃或无法正常工作)
我有以下代码,我在其中创建和布置代码中的所有内容。我想要做的是在点击按钮时修改 myTopContainer
但我无法更改宽度,只能修改高度。
知道为什么吗?
func setupAutoLayout(){
NSLayoutConstraint.activate([
// My Container
myTopContainer.bottomAnchor.constraint(equalTo: myButton.topAnchor, constant: -5),
myTopContainer.heightAnchor.constraint(equalToConstant: 50),
myTopContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15),
myTopContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15),
// My Button
myButton.widthAnchor.constraint(equalToConstant: 80),
myButton.heightAnchor.constraint(equalToConstant: 40),
myButton.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -15),
myButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -400)
])
}
@IBAction func relayoutViews(_ sender: Any) {
UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseIn, animations: {
self.myTopContainer.heightAnchor.constraint(equalToConstant: 50).isActive = false
self.myTopContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 15).isActive = false
// this is working, it changes the height
self.myTopContainer.heightAnchor.constraint(equalToConstant: 10).isActive = true
// this is not doing anything
self.myTopContainer.leadingAnchor.constraint(equalTo: self.myButton.trailingAnchor).isActive = true
self.view.layoutIfNeeded()
})
}
像这样的一行
self.myTopContainer.heightAnchor.constraint(equalToConstant: 50).isActive = false
每次都创建一个新的约束。它不会修改之前创建的约束。
当您设置自动布局时,您应该在实际调用 NSLayoutConstraint.activate()
之前保存对您稍后要修改的约束的引用。
稍后您可以将它们的 isActive 设置为 false。
例如:
var someConstraint: NSLayoutConstraint?
func setupAutoLayout(){
let aConstraint = myTopContainer.bottomAnchor.constraint(equalTo: myButton.topAnchor, constant: -5)
someConstraint = aConstraint
NSLayoutConstraint.activate([
// My Container
aConstraint
])
}
func editConstraint() {
self.someConstraint?.isActive = false
}
无论如何,当你编辑约束时要小心日志,你可能会在编辑时破坏某些东西。如果您看到那些破坏约束的日志,则意味着仍然有问题(即使它在视觉上看起来不错,它也可能在其他情况下崩溃或无法正常工作)