Программно создать вид стека - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь создать компонент даты с помощью программного стека.Если пользователь вводит неправильную дату, метка ошибки будет отображать соответствующее сообщение. Она работает нормально, если я создаю ее через раскадровку, но когда я использую свой программно созданный компонент, который добавил все элементы в виде стека.Я не могу видеть метку ошибки.Я проверил автоматическое расположение, которое я добавил в раскадровку и в классе компонентов, оба выглядят одинаково.Вот код для моего компонента.

        class CustomDateView: UIView {

    // MARK: - Variable
    private let dayTextField: UITextField = {
        let inputField = UITextField()
        inputField.borderStyle = .none
        inputField.layer.cornerRadius = 8.0
        inputField.layer.borderColor = UIColor.darkGray.cgColor
        inputField.backgroundColor = UIColor.blue
        inputField.textAlignment = .center
        inputField.tag = 0
        inputField.translatesAutoresizingMaskIntoConstraints = false
        return inputField
    }()

    private let monthTextField: UITextField = {
        let inputField = UITextField()
        inputField.borderStyle = .none
        inputField.layer.cornerRadius = 8.0
        inputField.layer.borderColor = UIColor.darkGray.cgColor
        inputField.backgroundColor = UIColor.blue
        inputField.textAlignment = .center
        inputField.tag = 1
        inputField.translatesAutoresizingMaskIntoConstraints = false
        return inputField
    }()

    private let yearTextField: UITextField = {
        let inputField = UITextField()
        inputField.borderStyle = .none
        inputField.layer.cornerRadius = 8.0
        inputField.layer.borderColor = UIColor.darkGray.cgColor
        inputField.backgroundColor = UIColor.blue
        inputField.textAlignment = .center
        inputField.tag = 2
        inputField.translatesAutoresizingMaskIntoConstraints = false
        return inputField
    }()

    private let errorLabel: UILabel = {
        let errorLabel = UILabel()
        errorLabel.textColor = .red
        errorLabel.textAlignment = .center
        errorLabel.numberOfLines = 0
        errorLabel.translatesAutoresizingMaskIntoConstraints = false
        return errorLabel
    }()

    private let monthSeparator: UILabel = {
        let label = UILabel()
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    private let yearSeparator: UILabel = {
        let label = UILabel()
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    private let horizontalStackView: UIStackView = {
        let stackView = UIStackView()
        stackView.axis = .horizontal
        stackView.alignment = .fill
        stackView.distribution = .fillProportionally
        stackView.spacing = 16.0
        stackView.translatesAutoresizingMaskIntoConstraints = false
        return stackView
    }()

    private let verticalStackView: UIStackView = {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.alignment = .fill
        stackView.distribution = .fillProportionally
        stackView.spacing = 8.0
        stackView.translatesAutoresizingMaskIntoConstraints = false
        return stackView
    }()


    // MARK: - Initialisers
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.setup()
    }

    // MARK: - Private Functions
    private func setup() {
        self.horizontalStackView.addArrangedSubview(self.dayTextField)
        self.horizontalStackView.addArrangedSubview(self.monthSeparator)
        self.horizontalStackView.addArrangedSubview(self.monthTextField)
        self.horizontalStackView.addArrangedSubview(self.yearSeparator)
        self.horizontalStackView.addArrangedSubview(self.yearTextField)
        self.verticalStackView.addArrangedSubview(self.horizontalStackView)
        self.verticalStackView.addArrangedSubview(self.errorLabel)
        self.addSubview(self.verticalStackView)

        self.translatesAutoresizingMaskIntoConstraints = false

        let selfType = type(of: self)

        NSLayoutConstraint.activate([
            self.dayTextField.heightAnchor.constraint(equalToConstant: 48.0),
            self.dayTextField.widthAnchor.constraint(equalToConstant: 62.0),
            self.monthTextField.widthAnchor.constraint(equalToConstant: 62.0),
            self.monthSeparator.widthAnchor.constraint(equalToConstant: 14.0),
            self.yearSeparator.widthAnchor.constraint(equalToConstant: 14.0)
            ])

        NSLayoutConstraint.activate([
            self.verticalStackView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0.0),
            self.verticalStackView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0.0),
            self.bottomAnchor.constraint(equalTo: self.verticalStackView.bottomAnchor),
            self.trailingAnchor.constraint(equalTo: self.verticalStackView.trailingAnchor)
            ])
        } 
}

Он правильно отображает вид, но после установки ошибки вид стека меток не будет увеличиваться для отображения текста. Я назначил фиксированную ширину для разделителей и текстового поля, потому что я хочу ихбыть той точной ширины и высоты.Есть ли какие-либо ошибки, которые я делаю, применяя здесь аутолайтинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...