更改更大尺寸的 heightAnchor,然后当前尺寸不起作用

change heightAnchor of higher size then current size is not working

我有一个高度为 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

我发现,如果我尝试将尺寸调整为比当前尺寸更大的尺寸,它不起作用。

知道为什么视图没有调整大小吗?


编辑 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

所以我发现我把高度改得比以前高了,它不起作用

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

// First
let heightConstraint = myView.heightAnchor.constraint(equalToConstant: 50)
heightConstraint.isActive = true
// Then to change
heightConstraint.constant = 20
myView.layoutIfNeeded()

根据要求,我在这里添加了 playground 示例(在 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 如何在单击 button 时更改 sampleView 的高度。我在这里的高度在 50 到 30 点之间切换。

目前,您每次都在创建关于视图高度的新规则。 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()
    }
}

这么短的故事,

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

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

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

所以只要你想更新就如上所示更新常量。就是这样。