2017-07-31 3 views
1

bottomConstraintにアクセスしてキーボードの高さと同じに設定してビューを移動しようとしています。これは私のコードであるキーボードが表示されてもこの入力ビューを上に移動して消えないようにしようとしています

// MARK: Scroll View Resize on Keyboard Events 
func setupViewResizerOnKeyboardShown() { 
    NotificationCenter.default.addObserver(self, 
              selector: #selector(keyboardWillShowForResizing), 
              name: Notification.Name.UIKeyboardWillShow, 
              object: nil) 
    NotificationCenter.default.addObserver(self, 
              selector: #selector(keyboardWillHideForResizing), 
              name: Notification.Name.UIKeyboardWillHide, 
              object: nil) 
} 
// MARK: Keyboard Scroll 
func keyboardWillShowForResizing(notification: Notification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 
     // We're not just minusing the kb height from the view height because 
     // the view could already have been resized for the keyboard before 
     // I need to get the bottom constraint and set it equal to keyboardSize.height 

    } else { 
     debugPrint("We're showing the keyboard and either the keyboard size or window is nil: panic widely.") 
    } 
} 
func keyboardWillHideForResizing(notification: Notification) { 
    //commentViewBottomConstraint.constant = 0 
} 

私は設定方法について:私は以下の私の二つの機能が表示され、キーボードを非表示にすることで、ユーザーがテキストを入力しているとき、私はビューを上に移動するためにアクセスしなければならない制約たことを確認していませんinputsContainerViewを含むすべてのTextFieldコンポーネント、と私の見解まで:

// MARK: Creation for TextFields 
    let nameTextField: UITextField = { 
     let tf = UITextField() 
     tf.placeholder = "Name" 
     tf.translatesAutoresizingMaskIntoConstraints = false 
     return tf 
    }() 
    let nameSeparatorView: UIView = { 
     let view = UIView() 
     view.backgroundColor = UIColor(r: 220, g: 220, b: 220) 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    }() 
    let emailTextField: UITextField = { 
     let tf = UITextField() 
     tf.placeholder = "Email" 
     tf.translatesAutoresizingMaskIntoConstraints = false 
     return tf 
    }() 
    let emailSeparatorView: UIView = { 
     let view = UIView() 
     view.backgroundColor = UIColor(r: 220, g: 220, b: 220) 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    }() 
    let passwordTextField: UITextField = { 
     let tf = UITextField() 
     tf.placeholder = "Password" 
     tf.translatesAutoresizingMaskIntoConstraints = false 
     tf.isSecureTextEntry = true 
     return tf 
    }() 
    let profileImageView: UIImageView = { 
     let imageView = UIImageView() 
     imageView.image = UIImage(named: "") 
     imageView.translatesAutoresizingMaskIntoConstraints = false 
     imageView.contentMode = .scaleAspectFill 
     return imageView 
    }() 
    lazy var loginRegisterSegmentedControl: UISegmentedControl = { 
     let sc = UISegmentedControl(items: ["Login", "Register"]) 
     sc.translatesAutoresizingMaskIntoConstraints = false 
     sc.tintColor = UIColor.white 
     sc.selectedSegmentIndex = 1 
     sc.addTarget(self, action: #selector(handleLoginRegisterChange), for: .valueChanged) 
     return sc 
    }() 
    //MARK: Change Button (Login/Register) 
    func handleLoginRegisterChange() { 
     let title = loginRegisterSegmentedControl.titleForSegment(at: loginRegisterSegmentedControl.selectedSegmentIndex) 
     loginRegisterButton.setTitle(title, for: UIControlState()) 

     // change height of inputContainerView, but how??? 
     inputsContainerViewHeightAnchor?.constant = loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 100 : 150 

     // change height of nameTextField 
     nameTextFieldHeightAnchor?.isActive = false 
     nameTextFieldHeightAnchor = nameTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 0 : 1/3) 
     // Hides name placeholder when selected imdex is selected 
     if loginRegisterSegmentedControl.selectedSegmentIndex == 0 { 
      nameTextField.placeholder = "" 
     } 
     else { 
      nameTextField.placeholder = "Username" 
     } 
     nameTextFieldHeightAnchor?.isActive = true 

     emailTextFieldHeightAnchor?.isActive = false 
     emailTextFieldHeightAnchor = emailTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 1/2 : 1/3) 
     emailTextFieldHeightAnchor?.isActive = true 

     passwordTextFieldHeightAnchor?.isActive = false 
     passwordTextFieldHeightAnchor = passwordTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 1/2 : 1/3) 
     passwordTextFieldHeightAnchor?.isActive = true 
    } 
    func setupLoginRegisterSegmentedControl() { 
     //need x, y, width, height constraints 
     loginRegisterSegmentedControl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     loginRegisterSegmentedControl.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor, constant: -12).isActive = true 
     loginRegisterSegmentedControl.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor, multiplier: 1).isActive = true 
     loginRegisterSegmentedControl.heightAnchor.constraint(equalToConstant: 36).isActive = true 
    } 
    func setupProfileImageView() { 
     //need x, y, width, height constraints 
     profileImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     profileImageView.bottomAnchor.constraint(equalTo: loginRegisterSegmentedControl.topAnchor, constant: -12).isActive = true 
     profileImageView.widthAnchor.constraint(equalToConstant: 150).isActive = true 
     profileImageView.heightAnchor.constraint(equalToConstant: 150).isActive = true 
    } 
    var inputsContainerViewHeightAnchor: NSLayoutConstraint? 
    var nameTextFieldHeightAnchor: NSLayoutConstraint? 
    var emailTextFieldHeightAnchor: NSLayoutConstraint? 
    var passwordTextFieldHeightAnchor: NSLayoutConstraint? 

    func setupInputsContainerView() { 
     //need x, y, width, height constraints 
     inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
     inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -24).isActive = true 
     inputsContainerViewHeightAnchor = inputsContainerView.heightAnchor.constraint(equalToConstant: 150) 
     inputsContainerViewHeightAnchor?.isActive = true 

     inputsContainerView.addSubview(nameTextField) 
     inputsContainerView.addSubview(nameSeparatorView) 
     inputsContainerView.addSubview(emailTextField) 
     inputsContainerView.addSubview(emailSeparatorView) 
     inputsContainerView.addSubview(passwordTextField) 

     //need x, y, width, height constraints 
     nameTextField.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: 12).isActive = true 
     nameTextField.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true 

     nameTextField.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true 
     nameTextFieldHeightAnchor = nameTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/3) 
     nameTextFieldHeightAnchor?.isActive = true 

     //need x, y, width, height constraints 
     nameSeparatorView.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor).isActive = true 
     nameSeparatorView.topAnchor.constraint(equalTo: nameTextField.bottomAnchor).isActive = true 
     nameSeparatorView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true 
     nameSeparatorView.heightAnchor.constraint(equalToConstant: 1).isActive = true 

     //need x, y, width, height constraints 
     emailTextField.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: 12).isActive = true 
     emailTextField.topAnchor.constraint(equalTo: nameTextField.bottomAnchor).isActive = true 

     emailTextField.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true 

     emailTextFieldHeightAnchor = emailTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/3) 

     emailTextFieldHeightAnchor?.isActive = true 

     //need x, y, width, height constraints 
     emailSeparatorView.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor).isActive = true 
     emailSeparatorView.topAnchor.constraint(equalTo: emailTextField.bottomAnchor).isActive = true 
     emailSeparatorView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true 
     emailSeparatorView.heightAnchor.constraint(equalToConstant: 1).isActive = true 

     //need x, y, width, height constraints 
     passwordTextField.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: 12).isActive = true 
     passwordTextField.topAnchor.constraint(equalTo: emailTextField.bottomAnchor).isActive = true 

     passwordTextField.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true 
     passwordTextFieldHeightAnchor = passwordTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/3) 
     passwordTextFieldHeightAnchor?.isActive = true 
    } 
    func setupLoginRegisterButton() { 
     //need x, y, width, height constraints 
     loginRegisterButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     loginRegisterButton.topAnchor.constraint(equalTo: inputsContainerView.bottomAnchor, constant: 12).isActive = true 
     loginRegisterButton.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true 
     loginRegisterButton.heightAnchor.constraint(equalToConstant: 50).isActive = true 
    } 

答えて

0

あなたinputsContainerViewは、この制約PU

inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 

とY位置です設定しますそれはビューの中央にあります。

下限制約はありません。

あなたがする必要がある最初の事はプロパティでこの制約を保存することです(VARのinputsYConstraintプロパティを作成)

inputsYConstraint = inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor) 
inputsYConstraint.isActive = true 

一番簡単な方法は、それを上に移動する制約に負の定数を設定されています。

また、この制約の優先度を下げて、キーボードが上がったときに変更する最低限の制約を追加することもできます。

+0

ありがとうございました、あなたはそれを上に移動するために制約に負の定数を設定することによって何を意味するのですか?どうすればいい?私はもともとそれをkeyboardSize.heightと同じにしたいと思っていました... –

+0

https://developer.apple.com/documentation/appkit/nslayoutconstraint inputsYConstraintのタイプはNSLayoutConstraintです。負の数に設定した場合、このビューを上に移動する「定数」というプロパティがあります(それは垂直に数をマイナスした数の中心になることを意味します) –

+0

変数を作成しました。負の数? –

関連する問題