Swift:以编程方式更改HeightAnchor

Jam*_*esG 3 nslayoutconstraint swift

我正在关注此视频教程:https : //www.youtube.com/watch?v=4rNtIeC_dsQ

当我在UI段控件中选择其他选项时,我正在努力使容器视图的高度发生变化

视频中大约17:51

我这样声明了var:

var inputsContainerHeightAnchor: NSLayoutConstraint?
Run Code Online (Sandbox Code Playgroud)

对于约束,我现在有:

inputContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
inputContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
inputContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -60).isActive = true
inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true
Run Code Online (Sandbox Code Playgroud)

对于段控件,我有:

func handleLoginRegisterChange() {

    let title = segmentedLoginRegisterControl.titleForSegment(at: segmentedLoginRegisterControl.selectedSegmentIndex)

    loginRegisterButton.setTitle(title, for: .normal)

    inputsContainerHeightAnchor?.constant = segmentedLoginRegisterControl.selectedSegmentIndex == 0 ? 100 : 150



}
Run Code Online (Sandbox Code Playgroud)

段控件的设置如下:

lazy var segmentedLoginRegisterControl: UISegmentedControl = {
    let sc = UISegmentedControl(items: ["Login", "Register"])
    sc.tintColor = .white
    sc.selectedSegmentIndex = 1
    sc.translatesAutoresizingMaskIntoConstraints = false
    sc.addTarget(self, action: #selector(handleLoginRegisterChange), for: .valueChanged)
    return sc
}()
Run Code Online (Sandbox Code Playgroud)

我正在使用Xcode版本8.1

但是,当我运行这是模拟器时,输入控制器视图为100。单击任何段时,它都不会更改。

有人可以看到我错过的任何东西吗?

rob*_*off 5

您未能正确执行的部分从视频中的16:50开始。但是我们可以从您发布的代码中找出问题所在。这些行是可疑的:

inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true
Run Code Online (Sandbox Code Playgroud)

这些行的第一行创建的实例NSLayoutConstraint,但不会激活它,也不会将其存储在变量中。因此,约束立即被破坏。除了浪费时间和电池电量外,它没有任何作用。

这些行的第二行提到了变量inputsContainerHeightAnchor,看起来很像它应该引用在前一行中创建的约束。但是上一行没有为该变量分配任何内容。如果没有其他为该变量分配值,则该变量为nil。由于使用?而不是进行!了取消引用,因此如果变量包含nil,则第二条语句不执行任何操作。

您可能打算编写以下代码:

inputsContainerHeightAnchor = inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor?.isActive = true
Run Code Online (Sandbox Code Playgroud)

第一行将新约束存储在变量中,第二行激活新约束。这就是视频在16:50左右开始发生的情况。您可能错过的时间大约是17:15,他说“我们将摆脱让步”,同时他从实例变量声明中复制变量名并将其粘贴到文本上let constraint。该行环绕在他的屏幕上,他的缩进不正确,并且他使用键盘快捷键进行复制和粘贴,因此很难遵循。您可能以为他只是删除了文本let constraint =。(这就是为什么我制作视频时会尽量避免使用键盘快捷键的原因。)

但是,最好这样写这两行:

inputsContainerHeightAnchor = inputContainerView.heightAnchor.constraint(equalToConstant: 150)
inputsContainerHeightAnchor!.isActive = true
Run Code Online (Sandbox Code Playgroud)

当你确定一个变量应该不会是零,并且是零是一个编程错误,然后使用!取消对它的引用。如果变量包含nil,程序将在该行停止(如果在Xcode下运行,则在调试器中)。如果您(和视频的作者)是用这种方式编写的,那么您可能会更快地发现错误,因为在您修复错误之前,该程序永远都不会越过第二行。