2016-11-22 63 views
0

我有一个在我的RegisterViewController中以编程方式创建的段控件。 registerbutton工作并将所有内容保存在Firebase数据库中,但当我切换到登录按钮时,不同文本字段的高度会发生变化,但第一个字段不会消失......从第一个文本字段中仍然可以看到一小段文本(正如你在图片上看到的那样)。此外,当我测试登录功能时,它不会以现有用户身份登录,但会在数据库中创建一个新用户,因此我认为它不会更改代码...Swift 3段视图错误

登录查看:

Login View

注册查看:

Register View

import UIKit 
import Firebase 

class RegisterViewController: UIViewController { 
    let inputsContainerView: UIView = { 
     let View = UIView() 
     View.backgroundColor = UIColor.white 
     View.translatesAutoresizingMaskIntoConstraints = false 
     View.layer.cornerRadius = 5 
     View.layer.masksToBounds = true 
     return View 
    }() 

    lazy var loginRegisterButton: UIButton = { 
     let button = UIButton(type: .system) 
     button.backgroundColor = UIColor(red: 80/255, green: 101/255, blue: 161/255, alpha: 1) 
     button.setTitle("Register", for: .normal) 
     button.setTitleColor(UIColor.white, for: .normal) 
     button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) 
     button.translatesAutoresizingMaskIntoConstraints = false 

     button.addTarget(self, action: #selector(handleRegister), for: .touchUpInside) 
     return button 

    }() 

    func handleLoginRegister() { 
     if loginRegisterSegmentedControl.selectedSegmentIndex == 0 { 
      handleLogin() 
     } else { 
      handleRegister() 
     } 
    } 

    func handleLogin() { 
      guard let email = emailTextField.text, let password = passwordTextField.text 
       else { 
        print("Form is not valid") 
        return 
      } 

     FIRAuth.auth()?.signIn(withEmail: email, password: password, completion: { (user, error) in 

      if error != nil { 
       print(error ?? "") 
       return 
      } 

      self.dismiss(animated: true, completion: nil) 
     }) 
    } 

    func handleRegister() { 
     guard let email = emailTextField.text, let password = passwordTextField.text, let name = nameTextField.text 
     else { 
      print("Form is not valid") 
      return 
     } 

     FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user: FIRUser?, error) in 

      if error != nil { 
       print(error ?? "") 
       return 
      } 

      guard let uid = user?.uid else { 
       return 
      } 

      //Succesfully authenticated user 

      let ref = FIRDatabase.database().reference(fromURL: "https://assemble-148108.firebaseio.com/") 
      let usersReference = ref.child("users").child(uid) 
      let values = ["name": name, "email": email] 
      usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in 

       if err != nil { 
        print(err ?? "") 
        return 
       } 
       print("Saved user successfully into Firebase db") 
      }) 
     }) 
    } 

    let nameTextField: UITextField = { 
     let tf = UITextField() 
     tf.placeholder = "Name" 
     tf.translatesAutoresizingMaskIntoConstraints = false 
     return tf 
    }() 

    let nameSeparatorView: UIView = { 
     let view = UIView() 
     view.backgroundColor = UIColor(colorLiteralRed: 220/225, green: 220/225, blue: 220/225, alpha: 1) 
     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(colorLiteralRed: 220/225, green: 220/225, blue: 220/225, alpha: 1) 
     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: "avatar") 
     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 
    }() 

    func handleLoginRegisterChange() { 
     let title = loginRegisterSegmentedControl.titleForSegment(at: loginRegisterSegmentedControl.selectedSegmentIndex) 
     loginRegisterButton.setTitle(title, for: .normal) 

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

    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = UIColor(colorLiteralRed: 61/225, green: 91/255, blue: 151/255, alpha: 1) 
     view.addSubview(inputsContainerView) 
     view.addSubview(loginRegisterButton) 
     view.addSubview(profileImageView) 
     view.addSubview(loginRegisterSegmentedControl) 

     setupInputsContainerView() 
     setuploginRegisterButton() 
     setupProfileImageView() 
     setupRegisterSegmentedControl() 

    } 
    //hier moet de kleur van de tijd helemaal bovenaan aangepast worden van zwart naar wit 
    //override func preferredStatusBarStyle() -> UIStatusBarStyle { 
     // return .lightContent 
    //} 

    func setupRegisterSegmentedControl() { 
     // 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: 100).isActive = true 
     profileImageView.heightAnchor.constraint(equalToConstant: 100).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: 30).isActive = true 

    } 
} 

回答

0

如果你想速战速决,您将nameTextField被隐藏

if loginRegisterSegmentedControl.selectedSegmentIndex == 0 { 
    nameTextField.isHidden = true 
} else { 
    nameTextField.isHidden = false 
} 

func handleLoginRegisterChange()执行此操作。你也不需要func handleLoginRegister(),它似乎没有被使用。

如果您想要正确的修复方法,当您切换段时,应该删除名称标签并重新约束。

+0

谢谢你的布局问题,现在就解决了。你知道为什么func handleLoginRegister()不起作用吗?我认为如果这个工作,登录问题也会得到解决。 – Maarten

+0

'handleLoginRegister'实际上并没有在任何地方设置。你需要它吗? –