2017-07-31 2 views
1

J'essaye de déplacer ma vue vers le haut en accédant à la bottomConstraint et en la réglant à la hauteur du clavier. Je ne sais pas quelle contrainte j'accéder afin de déplacer la vue lorsque l'utilisateur est saisie de texte, voici mes deux fonctions pour afficher et masquer le clavier:J'essaye de faire monter cette vue d'entrée pour qu'elle ne disparaisse pas quand le clavier apparaît

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

Ceci est mon code pour que je mets mon point de vue avec tous les composants, y compris textField inputsContainerView:

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

Répondre

0

Votre inputsContainerView définit sa position Y avec cette contrainte

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

qui pu Il est dans le centre de la vue.

Il n'y a pas d'ensemble de contraintes de bas.

La première chose que vous devez faire est de sauvegarder cette contrainte dans une propriété (créer une propriété var inputsYConstraint)

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

La chose la plus facile à faire est de définir une constante négative sur la contrainte de se déplacer vers le haut . Vous pouvez également réduire la priorité de cette contrainte et ajouter une contrainte minimale que vous définissez au minimum lorsque vous modifiez le clavier.

+0

Merci pour l'aide, que voulez-vous dire par définir une constante négative sur la contrainte pour le déplacer vers le haut? Comment ferais-je cela? Je voulais à l'origine le définir égal à keyboardSize.height ... –

+0

https://developer.apple.com/documentation/appkit/nslayoutconstraint Le type d'entréesYConstraint est NSLayoutConstraint. Il a une propriété nommée "constante" qui déplacerait cette vue vers le haut si vous définissez un nombre négatif (cela signifierait, centre verticalement moins un certain nombre) –

+0

J'ai créé la variable ... Où devrais-je le faire = à un nombre négatif? –