swift 设置约束时未更新框架和边界

vaqhlq81  于 2023-02-28  发布在  Swift
关注(0)|答案(2)|浏览(139)

创建约束时,受约束UI元素的框架和边界似乎没有立即更新。

NSLayoutConstraint.activate([
            counterLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            counterLabel.topAnchor.constraint(equalTo: timeLabel.bottomAnchor, constant: view.frame.size.height/100),
            counterLabel.widthAnchor.constraint(equalToConstant: view.frame.size.width/1.2),

            gameButton.heightAnchor.constraint(equalToConstant: (view.bounds.size.height-counterLabel.frame.maxY)) // THIS DOES NOT WORK

事实证明,尽管为counterLabel创建了约束,但它的框架和边界仍然是(0,0,0,0)。我发现有效的解决方案是将gameButton的高度锚放在viewDidLayoutSubviews中。
为什么会这样呢?我试着寻找其他的线程和文档,但是没有找到太多。

oxcyiej7

oxcyiej71#

例如,在使用框架或边界之前写入layoutIfNeeded()

layoutIfNeeded()
myView.layer.cornerRadius = myView.frame.width / 2

现在框架和边界返回真值
在您的情况下,可能需要设置约束,然后计算它们并将约束存储在变量中。

dwbf0jvd

dwbf0jvd2#

您不应尝试根据随时间变化的值将按钮高度设置为常量,而应设置按钮的顶部锚点和底部锚点,以便其高度能够相应地进行调整。
替换:

gameButton.heightAnchor.constraint(equalToConstant: (view.bounds.size.height-counterLabel.frame.maxY))

比如说:

gameButton.topAnchor.constraint(equalTo: counterLabel.bottomAnchor),
gameButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),

相关问题