UIScrollView не прокручивается несмотря на добавление ограничений Auto Layout

Я работаю над проектом, в котором я добавил несколько UITextFields в UIView, который действует как контейнерное представление. Затем я добавляю этот контейнерный вид в UIScrollView, который, в свою очередь, я добавляю в основной вид моего экрана. Проблема в том, что мой контейнерный вид появляется на экране, но не прокручивается, несмотря на то, что он прикреплен к UIScrollView, и я не могу сказать, почему. Весь код и ограничения есть в Swift.

Ниже приведен соответствующий код, который у меня есть:

private func setupViews() {
        view.backgroundColor = .nzRedColor()

        registerView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: self.view.frame.height)
        registerView.backgroundColor = UIColor.green

        registerScrollView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: 300.0)
        registerScrollView.backgroundColor = UIColor.blue


        let addViewsClosure = { (superview: UIView, views: UIView...)->() in
            for view in views {
                view.translatesAutoresizingMaskIntoConstraints = false
                if ((view as? UIImageView) != nil) {
                    superview.addSubview(view)
                } else if ((view as? UITextField) != nil) {
                    self.registerView.addSubview(view)
                    self.registerScrollView.addSubview(self.registerView)
                    superview.addSubview(self.registerScrollView)
                } else {
                    superview.addSubview(view)
                }
            }
        }

        let customizeTextFields = { (textfields: UITextField...) in
            for textfield in textfields {
                textfield.backgroundColor = UIColor(white: 1.0, alpha: 0.3)
                textfield.font = UIFont.systemFont(ofSize: 14, weight: UIFontWeightRegular)
                textfield.layer.cornerRadius = 2.0
            }
        }

        customizeTextFields(firstNameTextField, lastNameTextField, cityTextField, countryTextField, emailTextField, passwordTextField, passwordConfirmationTextField)


        addViewsClosure(view, logoImageView, firstNameTextField, lastNameTextField, cityTextField, countryTextField, emailTextField, passwordTextField, passwordConfirmationTextField, registerButton, skipButton)


        logoImageView.constrainTop(at: 50, after: topLayoutGuide.anchorableRepresentation)
        logoImageView.constrainCenterHorizontally()
        logoImageWidthConstraint = logoImageView.constrainWidth(at: 0)
        logoImageHeightConstraint = logoImageView.constrainHeight(at: 0)
        updateLogoImageSize()


        firstNameTextField.constrainTop(at: 10, after: logoImageView)
        firstNameTextField.constrainHeight(at: 50)
        firstNameTextField.constrainLeading(alignedWith: view, offset: 10)
        firstNameTextField.constrainTrailing(alignedWith: view, offset: -10)

        lastNameTextField.constrainTop(at: 10, after: firstNameTextField)
        lastNameTextField.constrainHeight(at: 50)
        lastNameTextField.constrainLeading(alignedWith: firstNameTextField)
        lastNameTextField.constrainTrailing(alignedWith: firstNameTextField)

        cityTextField.constrainTop(at: 10, after: lastNameTextField)
        cityTextField.constrainHeight(at: 50)
        cityTextField.constrainLeading(alignedWith: firstNameTextField)
        cityTextField.constrainTrailing(alignedWith: firstNameTextField)

        countryTextField.constrainTop(at: 10, after: cityTextField)
        countryTextField.constrainHeight(at: 50)
        countryTextField.constrainLeading(alignedWith: firstNameTextField)
        countryTextField.constrainTrailing(alignedWith: firstNameTextField)

        emailTextField.constrainTop(at: 10, after: countryTextField)
        emailTextField.constrainHeight(at: 50)
        emailTextField.constrainLeading(alignedWith: firstNameTextField)
        emailTextField.constrainTrailing(alignedWith: firstNameTextField)

        passwordTextField.constrainTop(at: 10, after: emailTextField)
        passwordTextField.constrainHeight(at: 50)
        passwordTextField.constrainLeading(alignedWith: firstNameTextField)
        passwordTextField.constrainTrailing(alignedWith: firstNameTextField)

        passwordConfirmationTextField.constrainTop(at: 10, after: passwordTextField)
        passwordConfirmationTextField.constrainHeight(at: 50)
        passwordConfirmationTextField.constrainLeading(alignedWith: firstNameTextField)
        passwordConfirmationTextField.constrainTrailing(alignedWith: firstNameTextField)

        registerView.constrainTop(at: 0)
        registerView.constrainHeight(at: self.view.frame.height)
        registerView.constrainLeading(at: 0)
        registerView.constrainTrailing(at: 0)

        registerScrollView.constrainTop(at: 50, after: logoImageView)
        registerScrollView.constrainHeight(at: 300.0)
        registerScrollView.constrainLeading(at: 0)
        registerScrollView.constrainTrailing(at: 0)

        registerButton.constrainTop(at: 30, after: passwordConfirmationTextField)
        registerButton.constrainHeight(at: 50)
        registerButton.constrainLeading(alignedWith: firstNameTextField)
        registerButton.constrainTrailing(alignedWith: firstNameTextField)

        skipButton <- { $0.top >= registerButton.anchors.bottom + 12 }
        skipButton.constrainBottom(at: 12)
        skipButton.constrainCenterHorizontally()
    }

Здесь я хотел бы отметить две вещи:

  1. Несмотря на то, что я сделал фоновый цвет registerView зеленым, я не вижу его.

  2. По какой-то причине все UITextFields появляются непосредственно в UIScrollView (потому что его цвет синий), а UIScrollView видим, но, к сожалению, не прокручивается. Кто-нибудь может увидеть, что я делаю не так?

1 ответ

Решение

При использовании автоматического макета с представлениями прокрутки содержимое представления прокрутки определяет .contentSize, Это означает, что ваш registerView все его ограничениядолжны быть установлены правильно.

Вы устанавливаете registerView фон зеленый, но вы не видите вид? Могу поспорить, если вы установите его .clipsToBounds в true Вы больше не увидите текстовые поля.

    registerView.constrainTop(at: 0)
    registerView.constrainHeight(at: self.view.frame.height)
    registerView.constrainLeading(at: 0)
    registerView.constrainTrailing(at: 0)

Вы установили ограничения Top, Leading, Trailing и Height - но похоже, что вам не хватает ширины и ширины.

Нижнее ограничение, вероятно, должно быть установлено на 0 - как Top, Leading и Trailing.

Я предполагаю, что вы хотите registerView Ограничение высоты определяется последним текстовым полем - passwordConfirmationTextField - но если это так, ты все еще скучаешь по этому.

Другие вопросы по тегам