移除约束 iOS

Dav*_*cek 0 constraints ios swift

我尝试消除约束。我想对纵向和横向有不同的限制。如果我将方向更改为纵向,我会调用函数setupConstrainsInPortrait,反之亦然。我有两个功能。

此功能设置人像模式。

func setupConstrainsInPortrait() {

    view.addSubview(myView)

    myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true
    myView.heightAnchor.constraint(equalToConstant: 300).isActive = true
    myView.widthAnchor.constraint(equalToConstant: view.frame.size.width).isActive = true

    view.addSubview(switchKmM)

    switchKmM.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    switchKmM.topAnchor.constraint(equalTo: myView.bottomAnchor, constant: 10).isActive = true
    switchKmM.heightAnchor.constraint(equalToConstant: 50).isActive = true
    switchKmM.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

    view.addSubview(speedLbl)

    speedLbl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    speedLbl.topAnchor.constraint(equalTo: view.bottomAnchor, constant: -50).isActive = true
    speedLbl.heightAnchor.constraint(equalToConstant: 50).isActive = true
    speedLbl.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

}
Run Code Online (Sandbox Code Playgroud)

此功能设置横向模式。

    func setupConstrainsInLandScape() {
    view.addSubview(myView)

    myView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true
    myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    myView.heightAnchor.constraint(equalToConstant: 300).isActive = true
    myView.widthAnchor.constraint(equalToConstant: 150).isActive = true

    view.addSubview(switchKmM)

    switchKmM.leftAnchor.constraint(equalTo: myView.rightAnchor, constant: 30).isActive = true
    switchKmM.topAnchor.constraint(equalTo: view.topAnchor, constant: 30).isActive = true
    switchKmM.heightAnchor.constraint(equalToConstant: 50).isActive = true
    switchKmM.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
}
Run Code Online (Sandbox Code Playgroud)

我在 viewWillTransition 中使用这些函数

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape {
        print("landscape!")
        view.backgroundColor = .green
        setupConstrainsInLandScape()
        self.viewWillLayoutSubviews()


    }
    else {
        print("portrét")
        view.backgroundColor = .white
        setupConstrainsInPortrait()
        self.viewWillLayoutSubviews()

    }
    super.viewWillTransition(to: size, with: coordinator)
}
Run Code Online (Sandbox Code Playgroud)

问题是,横向模式下的约束(来自纵向功能)不会被删除

我希望有人可以帮助我...谢谢

mat*_*att 5

你没有做足够的工作。您需要保留对您激活的所有约束的引用,以便以后可以停用它们。例如,你说:

myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true
myView.heightAnchor.constraint(equalToConstant: 300).isActive = true
myView.widthAnchor.constraint(equalToConstant: view.frame.size.width).isActive = true
Run Code Online (Sandbox Code Playgroud)

相反,你需要说类似的话

self.myConstraints1 = [
    myView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50),
    myView.heightAnchor.constraint(equalToConstant: 300),
    myView.widthAnchor.constraint(equalToConstant: view.frame.size.width),
]
Run Code Online (Sandbox Code Playgroud)

现在激活所有这些约束。在整个过程中以相同的方式进行。

因此,当由于方向发生变化而需要停用约束时,您可以引用它们并且可以这样做。