改变高度Anchor的大小,然后当前的大小是不工作的。

问题描述 投票:0回答:1

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

所以,我发现我把高度改得比以前高,它不工作。

swift constraints swift5 ios-autolayout heightanchor
1个回答
0
投票

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

0
投票

你应该保留对约束的引用,并改变常量值,然后调用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 变化的高度 sampleViewbutton 是点击的。我这里是在50点和30点的高度之间切换。


0
投票

所以短篇小说。

每次我想更新高度时,都要加上下面的一行,这是不对的。

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

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

所以无论什么时候你要更新都只需如上图所示更新常量即可。就这样了。

© www.soinside.com 2019 - 2024. All rights reserved.