2017-08-29 161 views
-1

我嘗試刪除約束。我希望對肖像和風景有不同的限制。如果我將方向更改爲縱向,則我調用函數setupConstrainsInPortrait,反之亦然。我有兩個功能。刪除約束iOS

此功能設置縱向模式。

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

的問題是使用這些功能,即限制(從縱向功能)以橫向模式不會被刪除

我希望有人能幫助我。 ..謝謝

+0

什麼問題?給出理想的結果與實際結果。 – matt

+0

問題是,沒有刪除橫向模式下的約束(來自縱向功能) –

+0

「橫向模式下的約束(來自縱向功能)不會被刪除」不出現意外。我沒有看到任何會刪除它們的代碼。你所做的只是說'isActive = true'。從來沒有你說'isActive = false'。所以你只是不斷添加和添加約束而不刪除任何。在那種情況下,你期望什麼? – matt

回答

3

你沒有做足夠的工作。您需要保留對您激活的所有約束的引用,以便稍後停用它們。例如,你說:

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

現在激活所有這些限制。始終以相同的方式進行。

因此,當由於方向改變而停用約束時,您可以引用它們並且可以這樣做。

+0

好,但我可以在self.myConstraints1中設置爲活動? –

+0

呃,夥計。如何'NSLayoutConstraint.activate(self.myConstraints1)'?幾乎沒有火箭科學。 – matt

+0

與「迅捷」無關。如果您認真對待問題,您至少願意查看基本文檔:https://developer.apple.com/documentation/uikit/nslayoutconstraint – matt

-1

您可以刪除您的約束使用:

myView.constraints.removeAll() 

在設置新的之前。

+0

在投票前查看問題。他在問如何消除這些限制。我回答瞭如何。 – GIJOW

+0

我做到了。他甚至沒有說出他的結果或他的企圖結果。他問如何刪除,我回答了。 – GIJOW

+0

視圖上的約束屬性是不可變的 - 您不能使用可變函數removeAll()。我想你的意思是說'myView.removeConstraints(myView.constraints)' – swillsea