去除iOS的限制

3

我试图移除约束条件。我希望在纵向和横向布局方面设置不同的约束条件。如果我将方向更改为纵向,则调用函数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

}

这个函数设置横向模式。

    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
}

我在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)
}

问题是,从肖像模式中的约束条件在横向模式下没有被删除。
我希望有人能帮助我...谢谢。

问题/难题是什么?请说明期望的结果与实际结果。 - matt
问题在于,横屏模式下的限制(来自纵向功能)没有被删除。 - David Kadlcek
“从纵向功能中的约束在横向模式下没有被删除。”这并不奇怪。我没有看到任何可以删除它们的代码。你所做的就是说isActive = true。你从未说过isActive = false。因此,你只是不断地添加约束,而从未删除任何约束。在这种情况下,你期望什么呢? - matt
2个回答

8

你的工作还不够。你需要保留对所有已激活约束的引用,以便稍后可以将其停用。例如,你正在说:

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

相反,你需要说类似于

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),
]

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

因此,当需要因为方向改变而停用约束时,您就有了对它们的引用,并且可以这样做。


与“Swift”无关。如果您认真对待一个问题,您至少愿意查看基本文档:https://developer.apple.com/documentation/uikit/nslayoutconstraint - matt
我对我要添加的视图有一个弱引用。我完全按照您所说的做了。当我停用存储的约束,然后从父视图中删除视图时,我的弱引用仍然持有该视图。即使该视图不再有父视图! - hasan
我在将视图从其父视图中移除后清空数组。 - hasan
父视图是UITabBar。无法从中删除约束,因为它由UITabBarController控制。 - hasan
将弱引用设置为nil是否安全?我在屏幕上不断添加(创建新的)/删除此视图。 - hasan
1
@hasan 问问题按钮位于页面右上角。 - matt

-8

您可以使用以下方式删除约束:

myView.constraints.removeAll()

在设置新的之前。


在你点踩之前,请先看一下问题。他在问如何移除限制条件,我已经回答了如何移除。 - GIJOW
我做了。他甚至没有说明他的结果或尝试的结果。他问如何删除,我给出了答案。 - GIJOW
2
视图的约束属性是不可变的 - 无法使用可变函数 removeAll()。我认为你想说的是 myView.removeConstraints(myView.constraints) - swillsea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接