在Swift 3中使用SnapKit修改约束来删除一个UIView

问题描述:

我正在修改UIView高度的约束,它由nameTextField和它的superView inputContainerView使用SnapKit组成。我安排nameTextField的高度等于inputContainerView高度的三分之一。我的目的是在按SegmentedControl时删除nameTextField。 当我尝试修改常量时,它完美地工作。 但是,当我尝试修改从(1/3)乘数高度值到0,有时它崩溃,有时我写的其他textField(passwordTextField和emailTextField)消失。 我使用updateContraint来更新一些约束。 我该如何解决这个问题?谢谢在Swift 3中使用SnapKit修改约束来删除一个UIView

inputContainerView.snp.makeConstraints { (make) in 
     make.centerX.equalTo(view.snp.centerX) 
     make.centerY.equalTo(view.snp.centerY) 
     // constraintAnchor is equal to offset 
     make.width.equalTo(view.snp.width).offset(-24) 
     make.height.equalTo(150) 
    } 

    // constraint for nameTextField 
    inputContainerView.addSubview(nameTextField) 
    //x y width height constraint using Snap Kit 
    nameTextField.snp.makeConstraints { (make) in 
     make.left.equalTo(inputContainerView.snp.left).offset(12) 
     make.top.equalTo(inputContainerView.snp.top) 
     make.width.equalTo(inputContainerView.snp.width) 
     make.height.equalTo(inputContainerView.snp.height).multipliedBy(0.333) 
    } 
func handleLoginRegisterChange() { 
    let title = loginRegisterSegmentedControl.titleForSegment(at: loginRegisterSegmentedControl.selectedSegmentIndex) 
    loginRegisterButton.setTitle(title, for: .normal) 

    // change height of inputcontainerview 
    if loginRegisterSegmentedControl.selectedSegmentIndex == 0 { 
     inputContainerView.snp.updateConstraints({ (update) in 
      update.height.equalTo(100) 
     }) 
     nameTextField.snp.remakeConstraints({ (remake) in 
      remake.height.equalTo(inputContainerView.snp.height).multipliedBy(0) 
     }) 
    } else if loginRegisterSegmentedControl.selectedSegmentIndex == 1 { 
     inputContainerView.snp.updateConstraints({ (update) in 
      update.height.equalTo(150) 
     }) 
     nameTextField.snp.remakeConstraints({ (remake) in 
      remake.height.equalTo(inputContainerView.snp.height).multipliedBy(0.333) 
     }) 
    } 
} 
// constraint for nameSeparator 
    inputContainerView.addSubview(nameSeparator) 
    //x y width height constraint using Snap Kit 
    nameSeparator.snp.makeConstraints { (make) in 
     make.left.equalTo(inputContainerView.snp.left).offset(12) 
     make.top.equalTo(nameTextField.snp.bottom) 
     make.right.equalTo(inputContainerView.snp.right).offset(-12) 
     make.height.equalTo(1) 
    } 

    // constraint for emailTextField 
    inputContainerView.addSubview(emailTextField) 
    //x y width height constraint using Snap Kit 
    emailTextField.snp.makeConstraints { (make) in 
     make.left.equalTo(inputContainerView.snp.left).offset(12) 
     make.top.equalTo(nameSeparator.snp.bottom) 
     make.width.equalTo(inputContainerView.snp.width) 
     make.height.equalTo(inputContainerView.snp.height).multipliedBy(0.333) 
    } 

    // constraint for emailSeparator 
    inputContainerView.addSubview(emailSeparator) 
    //x y width height constraint using Snap Kit 
    emailSeparator.snp.makeConstraints { (make) in 
     make.left.equalTo(inputContainerView.snp.left).offset(12) 
     make.top.equalTo(emailTextField.snp.bottom) 
     make.right.equalTo(inputContainerView.snp.right).offset(-12) 
     make.height.equalTo(1) 
    } 

    // constraint for passwordTextField 
    inputContainerView.addSubview(passwordTextField) 
    passwordTextField.snp.makeConstraints { (make) in 
     make.left.equalTo(inputContainerView.snp.left).offset(12) 
     make.top.equalTo(emailSeparator.snp.bottom) 
     make.width.equalTo(inputContainerView.snp.width) 
     make.height.equalTo(inputContainerView.snp.height).multipliedBy(0.333) 
    } 

这里的显示图像: enter image description here enter image description here

remakeConstraints将删除所有以前安装的限制。所以,你可能会删除所有*,领先等等的限制,重新安装高度。您应该使用updateConstraints或者最初使用所有声明的约束进行重拍。