尽管添加了“自动布局”约束,UIScrollView仍未滚动

时间:2017-06-14 18:54:30

标签: ios swift uiscrollview autolayout

我正在开发一个项目,我已将多个UITextField添加到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. 由于某种原因,所有UITextField都直接出现在UIScrollView上(因为它的颜色为蓝色),并且UIScrollView是可见的,但遗憾的是不可滚动。任何人都可以看到我做错了吗?

1 个答案:

答案 0 :(得分:2)

使用带滚动视图的自动布局时,滚动视图的内容定义.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限制 - 但看起来您没有丢失Width和Bottom。

底部约束应该设置为0 - 如Top,Leading和Trailing。

我猜你想要registerView高度限制由最后一个文字字段确定 - passwordConfirmationTextField - 但如果是这样的话,你还是会遗漏那一个。