更改更大尺寸的 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()
这是最重要的一步,而不是按照我在问题中添加的方式添加约束
所以只要你想更新就如上所示更新常量。就是这样。
我有一个高度为 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()
这是最重要的一步,而不是按照我在问题中添加的方式添加约束
所以只要你想更新就如上所示更新常量。就是这样。