我有一个高度为50的视图
myView.heightAnchor.constraint(equalToConstant: 50).isActive = true
现在我想做的是,当我点击按钮(buton1)时,我想将其高度改为20。所以我做了下面的工作,它的工作正常。
myView.heightAnchor.constraint(equalToConstant: 20).isActive = true
现在在 myView
我还有一个按钮(button2),当我点击它的时候,我想回到之前的高度50,但是没有用。
myView.heightAnchor.constraint(equalToConstant: 50).isActive = true
问题就出在这里。现在视图没有像点击button1时那样重新调整大小。
注意:
当我点击button1 &使用下面的代码时,重新大小也不工作。
myView.heightAnchor.constraint(equalToConstant: 100).isActive = true
我发现,如果我尝试重新调整大小到比当前大小更高的尺寸,它不工作。
知道为什么视图不能重新调整大小吗?
即使我在更新高度锚后写了下面的内容,但还是不行。
myView.layoutIfNeeded()
self.view.layoutIfNeeded()
工作 Option 1
当点击 button1
,我做下面的工作。
myView.heightAnchor.constraint(equalToConstant: 40).isActive = true
当点击 button2
我做以下工作。
myView.heightAnchor.constraint(equalToConstant: 30).isActive = true
不工作 Option 2
当点击 button1
,我做下面的工作。
myView.heightAnchor.constraint(equalToConstant: 40).isActive = true
当点击 button2
我做了下面和 NOT WORK
.
myView.heightAnchor.constraint(equalToConstant: 50).isActive = true
所以,我发现我把高度改得比以前高,它不工作。
目前,你每次都在创建一个关于视图高度的新规则。iOS不理解如何让一个视图同时具有10、20和30像素的高度,所以它会做最低的那个。为了避免创建冲突的高度,你需要有一个高度规则,并在需要的时候改变这个规则的常数。这里有一个有点包含的例子。
class CoolView: UIViewController {
lazy var myView = UIView()
lazy var myViewHeightAnchor = myView.heightAnchor.constraint(equalToConstant: 10)
override func viewDidLoad() {
super.viewDidLoad()
myView.backgroundColor = .black//livesMatters
myView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(myView)
NSLayoutConstraint.activate([
myView.topAnchor.constraint(equalTo: view.topAnchor),
myView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
myView.widthAnchor.constraint(equalToConstant: 10),
myViewHeightAnchor
])
}
@objc func someButtonTapped() {
myViewHeightAnchor.constant = 20
view.layoutIfNeeded()
}
@objc func anotherButtonTapped() {
myViewHeightAnchor.constant = 30
view.layoutIfNeeded()
}
}
你应该保留对约束的引用,并改变常量值,然后调用layoutIfNeeded方法来实现。下面是怎么做的。
// First
let heightConstraint = myView.heightAnchor.constraint(equalToConstant: 50)
heightConstraint.isActive = true
// Then to change
heightConstraint.constant = 20
myView.layoutIfNeeded()
按照要求,我在这里添加了游乐场示例(在Xcode-playground上试试)。
import UIKit
import PlaygroundSupport
class ViewController: UIViewController {
var heightConstraint: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
let sampleView = UIView()
sampleView.backgroundColor = .green
sampleView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(sampleView)
heightConstraint = sampleView.heightAnchor.constraint(equalToConstant: 50)
let button = UIButton(type: .contactAdd)
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(self, action: #selector(handleAction), for: .touchUpInside)
view.addSubview(button)
NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
sampleView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
sampleView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
heightConstraint!,
sampleView.widthAnchor.constraint(equalToConstant: 200)
])
}
@objc func handleAction() {
heightConstraint?.constant = heightConstraint?.constant == 50 ? 30 : 50
}
}
PlaygroundPage.current.setLiveView(ViewController())
这里你可以看到如何更新 heightConstraint
变化的高度 sampleView
当 button
是点击的。我这里是在50点和30点的高度之间切换。
所以短篇小说。
每次我想更新高度时,都要加上下面的一行,这是不对的。
myView.heightAnchor.constraint(equalToConstant: 100).isActive = true
有了这个,它做的是取最小的高度并设置。例如,如果我把高度设置为100、20、80三次,即使我用80运行,它也会取20作为高度。
为了避免这种情况,我们必须为高度约束添加一个变量。
var heightConstraint : NSLayoutConstraint?
现在在向视图添加约束时,添加如下。
heightConstraint = mainCVView.heightAnchor.constraint(equalToConstant: 50)
heightConstraint!.isActive = true
现在只要你想更新高度,就按下面的方法做,而不是再次添加约束。
heightConstraint?.constant = 0
heightConstraint?.isActive = true
myView.layoutIfNeeded()
这是最重要的一步,而不是像我在问题中添加约束的方式。
所以无论什么时候你要更新都只需如上图所示更新常量即可。就这样了。