如何停用我的约束?

时间:2018-02-07 04:52:21

标签: ios swift

我有一个在swift中以编程方式创建的UITextView,这是我在我的viewDidLoad()中为我的控制器所拥有的。

let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
if isPortrait {
    searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7).isActive = true
} else {
    searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1).isActive = true
}

这是searchTextView的设置方式

func setupView() {
    self.layer.cornerRadius = 8.0
    self.translatesAutoresizingMaskIntoConstraints = false
    self.textContainerInset = UIEdgeInsets(top: 12, left: 10, bottom: 0, right: 10)
    self.textContainer.maximumNumberOfLines = 1
    self.textContainer.lineBreakMode = .byTruncatingHead
    self.autocorrectionType = .no
    self.text = ""
    self.font = Constants.fonts().largeFont
    self.backgroundColor = UIColor.white
    self.adjustsFontForContentSizeCategory = true
    self.textColor = UIColor.black

    self.layer.borderColor = UIColor.gray.cgColor
    self.layer.borderWidth = 0.25

    // Need clipsToBounds = false to show shadow

    self.clipsToBounds = false
    self.layer.shadowRadius = 20.0
    self.layer.shadowColor = UIColor.gray.cgColor
    self.layer.shadowOffset = CGSize(width: 2.0, height: 2.0)
    self.layer.shadowOpacity = 0.5

    self.tintColor = Constants.colors().primaryLightColor

}

这为searchTextView提供了一个基于设备方向的不同widthAnchor。这很好,但是,稍后我会检查设备方向何时更改并删除并添加相应的widthAnchors。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    sideMenuLauncher.dismissSideMenu(duration: 0)

    let toPortraitMode = self.view.frame.size.width > size.width
    searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7).isActive = toPortraitMode
    searchTextView.widthAnchor.constraint(equalToConstant: size.width * 0.1).isActive = !toPortraitMode


    for constraint in view.constraints {
        print("\(constraint)\n")
    }

    searchTextView.updateConstraints()
    searchTextView.layoutIfNeeded()

}

但是这实际上并没有停用任何约束,正如它在这个控制台输出中所说的那样:

(
"<NSLayoutConstraint:0x60c000896170 PickupApp.SearchBarView:0x7f7ee1016a00.width == 56.8   (active)>",
"<NSLayoutConstraint:0x604000c9c6b0 PickupApp.SearchBarView:0x7f7ee1016a00.width == 397.6   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x604000c9c6b0 PickupApp.SearchBarView:0x7f7ee1016a00.width == 397.6   (active)>

我无法弄清楚为什么即使添加了约束也没有停用这些约束。

3 个答案:

答案 0 :(得分:0)

u32_result

答案 1 :(得分:0)

您需要存储该约束,以便稍后停用它。

使用全局变量来存储约束。

var cons:NSLayoutConstraint?

按如下所示更改viewDidLoad()以便稍后访问相同的约束:

override func viewDidLoad() {
    super.viewDidLoad()
    let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
    if isPortrait {
        self.cons = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7)

    } else {
        self.cons = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1)
    }
    self.cons?.isActive = true
}

答案 2 :(得分:0)

我希望以下代码能为您提供帮助,

1)声明全局变量

var searchTextViewPortraitWidthConstraint: NSLayoutConstraint?
var searchTextViewLandscapeWidthConstraint: NSLayoutConstraint?
let searchTextView = UITextView()

2) viewDidLoad()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        setupSearchTextView()
        let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
        if isPortrait {
            searchTextViewPortraitWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7)
            searchTextViewLandscapeWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1)

            searchTextViewPortraitWidthConstraint?.isActive = true
        } else {
            searchTextViewLandscapeWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1)
            searchTextViewPortraitWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7)
            searchTextViewLandscapeWidthConstraint?.isActive = true
        }
    }

配置textview

func setupSearchTextView(){
        searchTextView.frame = CGRect(x: <#T##CGFloat#>, y: <#T##CGFloat#>, width: <#T##CGFloat#>, height: <#T##CGFloat#>)
        /*
         .
         .
         .
         .
         .
         .*/
    }

3)根据设备方向激活或停用宽度约束使用以下任一方法(即viewWillLayoutSubviews()viewDidLayoutSubviews())。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
    if isPortrait{
        searchTextViewPortraitWidthConstraint?.isActive = true
        searchTextViewLandscapeWidthConstraint?.isActive = false
    }else{
        searchTextViewPortraitWidthConstraint?.isActive = false
        searchTextViewLandscapeWidthConstraint?.isActive = true
    }
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
    if isPortrait{
        searchTextViewPortraitWidthConstraint?.isActive = true
        searchTextViewLandscapeWidthConstraint?.isActive = false
    }else{
        searchTextViewPortraitWidthConstraint?.isActive = false
        searchTextViewLandscapeWidthConstraint?.isActive = true
    }
}