更改高度较大尺寸的锚点,则当前大小不起作用



我有一个高度为 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 时那样重新调整大小。

注意:

当我单击按钮1并使用以下代码时,重新调整大小也不起作用。

myView.heightAnchor.constraint(equalToConstant: 100).isActive = true

我发现如果我尝试将大小重新调整为当前大小的更大大小,它不起作用。

知道为什么视图不重新调整大小吗?


编辑 1

更新高度锚点后,我甚至在下面写了,但仍然无法正常工作。

myView.layoutIfNeeded()
self.view.layoutIfNeeded()

编辑 2

工作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()
}
}

您应该保留对约束的引用并更改常量值,然后调用 layoutIfNeed 方法来实现此目的。方法如下:

// 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())

在这里,您可以看到单击button时更新heightConstraint如何更改sampleView的高度。我在这里的高度在 50 到 30 点之间切换。

所以短篇小说,

每次我想更新高度时,我都会在下面添加一行,这是错误的。

myView.heightAnchor.constraint(equalToConstant: 100).isActive = true

有了这个,它所做的就是采取最小的高度并设置它。例如,如果我将身高设置为 3 倍为 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()

这是最重要的一步,而不是像我添加问题的方式添加约束

因此,每当您想要更新时,只需更新常量,如上所示。就是这样。

最新更新