动态调整TableViewController单元的大小

时间:2020-02-15 12:55:54

标签: ios swift uitableview uitextfield cell

在我的项目中,一个SignUpViewController像这样:

enter image description here

所有textFields都是cells中的自定义tableViewController

TableView:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 7
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // 1st cell -> email textfield
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpEmailCell", for: indexPath) as! SignUpEmailCell
        return cell
    // 2nd cell -> anzeigename
    }else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpAnzeigeName", for: indexPath) as! SignUpAnzeigeName
        return cell
    // 3rd cell -> Wishlist-Handle
    }else if indexPath.row == 2 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpHandleCell", for: indexPath) as! SignUpHandleCell
        return cell
    // 4th cell -> passwort textfield
    }else if indexPath.row == 3 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpPasswordCell", for: indexPath) as! SignUpPasswordCell
        return cell
    // 5th cell -> repeat password textfield
    }else if indexPath.row == 4 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpPasswordRepeatCell", for: indexPath) as! SignUpPasswordRepeatCell
        return cell
    // 6th cell -> document label
    }else if indexPath.row == 5 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpDocumentCell", for: indexPath) as! SignUpDocumentCell
        return cell
    }
    // last cell -> signUpButton
    let cell = tableView.dequeueReusableCell(withIdentifier: "SignUpButtonCell", for: indexPath) as! SignUpButtonCell
    return cell
}

Password-Cell(每个单元格的基本结构都相同)

    class SignUpPasswordCell: UITableViewCell, UITextFieldDelegate {

    public static let reuseID = "SignUpPasswordCell"

    lazy var eyeButton: UIButton = {
        let v = UIButton()
        v.addTarget(self, action: #selector(eyeButtonTapped), for: .touchUpInside)
        v.setImage(UIImage(named: "eyeOpen"), for: .normal)
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    lazy var passwordTextField: CustomTextField = {
        let v = CustomTextField()
        v.borderActiveColor = .white
        v.borderInactiveColor = .white
        v.textColor = .white
        v.font = UIFont(name: "AvenirNext-Regular", size: 17)
        v.placeholder = "Passwort"
        v.placeholderColor = .white
        v.placeholderFontScale = 0.8
        v.minimumFontSize = 13
        v.borderStyle = .line
        v.addTarget(self, action: #selector(SignUpPasswordCell.passwordTextFieldDidChange(_:)),for: .editingChanged)
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    required init?(coder: NSCoder) {fatalError("init(coder:) has not been implemented")}

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        self.backgroundColor = .clear

        passwordTextField.delegate = self

        eyeButton.isHidden = true
        passwordTextField.textContentType = .newPassword
        passwordTextField.isSecureTextEntry.toggle()

        setupViews()
    }

    func setupViews(){
        contentView.addSubview(passwordTextField)
        contentView.addSubview(eyeButton)

        passwordTextField.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        passwordTextField.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        passwordTextField.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        passwordTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true

        eyeButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -5).isActive = true
        eyeButton.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 10).isActive = true
    }

    var check = true
    @objc func eyeButtonTapped(_ sender: Any) {

        check = !check

        if check == true {
            eyeButton.setImage(UIImage(named: "eyeOpen"), for: .normal)
        } else {
            eyeButton.setImage(UIImage(named: "eyeClosed"), for: .normal)
        }
        passwordTextField.isSecureTextEntry.toggle()

            if let existingText = passwordTextField.text, passwordTextField.isSecureTextEntry {
                /* When toggling to secure text, all text will be purged if the user
                 continues typing unless we intervene. This is prevented by first
                 deleting the existing text and then recovering the original text. */
                passwordTextField.deleteBackward()

                if let textRange = passwordTextField.textRange(from: passwordTextField.beginningOfDocument, to: passwordTextField.endOfDocument) {
                    passwordTextField.replace(textRange, withText: existingText)
                }
            }

            /* Reset the selected text range since the cursor can end up in the wrong
             position after a toggle because the text might vary in width */
            if let existingSelectedTextRange = passwordTextField.selectedTextRange {
                passwordTextField.selectedTextRange = nil
                passwordTextField.selectedTextRange = existingSelectedTextRange
            }
    }

    @objc func passwordTextFieldDidChange(_ textField: UITextField) {
            if textField.text == "" {
                self.eyeButton.isHidden = true
            }else {
                self.eyeButton.isHidden = false
            }

    }
}

问题:

我希望能够显示一些textFields 被选中时的一些额外信息。 例如:passwordTextField正在编辑时,我想在文本字段正下方显示密码要求。但是额外的信息只能在编辑时或编辑后显示。刚显示ViewController时,它仍然应该看起来像上面的图片。

我希望我的问题已经解决,并且感谢您的帮助:)如果您需要更多信息/代码,请告诉我。

0 个答案:

没有答案
相关问题