3

SnapKitを使用して、nameTextFieldとそのsuperView inputContainerViewで構成されるUIViewの高さの制約を変更しています。nameTextField の高さが、inputContainerView の高さの 3 分の 1 になるように調整します。私の目的は、SegmentedControl が押されたときに nameTextField を削除することです。定数を変更しようとすると、完全に機能しました。しかし、乗数の高さの値を (1/3) から 0 に変更しようとすると、クラッシュすることがあり、私が書いた他の textField (passwordTextField と emailTextField) が消えることがあります。制約の一部を更新するために updateContraint を使用しています。これを修正するにはどうすればよいですか?ありがとうございました

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

画像は次のとおりです。 ここに画像の説明を入力 ここに画像の説明を入力

4

1 に答える 1

13

remakeConstraints以前にインストールされたすべての制約を削除します。したがって、おそらくトップ、リーディングなどの制約をすべて削除し、高さだけを再インストールしています。最初に宣言されたすべての制約を使用するupdateConstraintsか、リメイクする必要があります。

于 2017-11-28T15:55:37.563 に答える