具有自动布局的UIScrollView不滚动

问题描述

我一次又一次看到相同的问题,每个问题都有相同的答案; “您需要将最后一个视图的bottomAnchor设置为与scrollView的bottomAnchor相等,以便它展开”。

好了,滚动视图滚动了(我看到滚动条移动了),但是视图却不滚动!这是代码;

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view,typically from a nib.
    
    setupConstraints()
}

fileprivate func setupConstraints() {
    setupScrollViewConstraints()
    setupLogoImageViewConstraints()
    setupUsernameTextFieldConstraints()
    setupPasswordTextFieldConstraints()
    setupShowAndHideButtonConstraints()
    setupForgotPasswordButtonConstraints()
    setupLoginButtonConstraints()
    setupAccountLabelConstraints()

    let signInWithAppleButton = setupSignInWithAppleButton()
    setupLoginWithFacebookButtonConstraints(signInWithAppleButton)

    setupSignUpButtonConstraints()
    setupTermsOfUseButtonConstraints()
}

fileprivate func setupScrollViewConstraints() {
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        scrollView.topAnchor.constraint(equalTo: self.view.topAnchor),scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
    ])
}

fileprivate func setupLogoImageViewConstraints() {
    logoImageView.translatesAutoresizingMaskIntoConstraints = false
    
    if #available(iOS 11.0,*) {
        NSLayoutConstraint.activate([
            logoImageView.topAnchor.constraint(equalTo: scrollView.safeAreaLayoutGuide.topAnchor,constant: 16),logoImageView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),logoImageView.widthAnchor.constraint(equalToConstant: 112),logoImageView.heightAnchor.constraint(equalToConstant: 112)
        ])
    }
    else {
        NSLayoutConstraint.activate([
            logoImageView.topAnchor.constraint(equalTo: scrollView.topAnchor,logoImageView.heightAnchor.constraint(equalToConstant: 112)
        ])
    }
}

fileprivate func setupUsernameTextFieldConstraints() {
    usernameTextField.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        usernameTextField.topAnchor.constraint(equalTo: logoImageView.bottomAnchor,usernameTextField.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),usernameTextField.widthAnchor.constraint(equalToConstant: self.view.frame.width / 1.4),usernameTextField.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupPasswordTextFieldConstraints() {
    passwordTextField.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        passwordTextField.topAnchor.constraint(equalTo: usernameTextField.bottomAnchor,constant: 8),passwordTextField.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),passwordTextField.widthAnchor.constraint(equalToConstant: self.view.frame.width / 1.4),passwordTextField.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupShowAndHideButtonConstraints() {
    showAndHideButton.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        showAndHideButton.leadingAnchor.constraint(equalTo: passwordTextField.trailingAnchor,constant: -30),showAndHideButton.trailingAnchor.constraint(equalTo: passwordTextField.trailingAnchor),showAndHideButton.centerYAnchor.constraint(equalTo: passwordTextField.centerYAnchor),showAndHideButton.heightAnchor.constraint(equalToConstant: 20)
    ])
}

fileprivate func setupForgotPasswordButtonConstraints() {
    forgotPasswordButton.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        forgotPasswordButton.topAnchor.constraint(equalTo: passwordTextField.bottomAnchor),forgotPasswordButton.leadingAnchor.constraint(equalTo: passwordTextField.leadingAnchor),forgotPasswordButton.trailingAnchor.constraint(equalTo: passwordTextField.trailingAnchor),forgotPasswordButton.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupLoginButtonConstraints() {
    loginButton.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        loginButton.topAnchor.constraint(equalTo: forgotPasswordButton.bottomAnchor,constant: 20),loginButton.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),loginButton.widthAnchor.constraint(equalToConstant: 210),loginButton.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupAccountLabelConstraints() {
    accountLabel.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        accountLabel.topAnchor.constraint(equalTo: loginButton.bottomAnchor,constant: 40),accountLabel.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),accountLabel.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupSignInWithAppleButton() -> UIControl? {
    if #available(iOS 13.0,*) {
        let signInWithAppleButton = ASAuthorizationAppleIDButton(type: .default,style: .white)
        
        signInWithAppleButton.addTarget(self,action: #selector(loginWithApple(_:)),for: .touchUpInside)
        signInWithAppleButton.cornerRadius = 12
        
        scrollView.addSubview(signInWithAppleButton)
        
        signInWithAppleButton.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            signInWithAppleButton.topAnchor.constraint(equalTo: accountLabel.bottomAnchor,signInWithAppleButton.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),signInWithAppleButton.widthAnchor.constraint(equalToConstant: 210),signInWithAppleButton.heightAnchor.constraint(equalToConstant: 45)
        ])
        
        return signInWithAppleButton
    }
    
    return nil
}

fileprivate func setupLoginWithFacebookButtonConstraints(_ signInAppleButton: UIControl?) {
    facebookButton.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        facebookButton.topAnchor.constraint(equalTo: signInAppleButton?.bottomAnchor ?? accountLabel.bottomAnchor,facebookButton.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),facebookButton.widthAnchor.constraint(equalToConstant: 210),facebookButton.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupSignUpButtonConstraints() {
    signUpButton.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        signUpButton.topAnchor.constraint(equalTo: facebookButton.bottomAnchor,signUpButton.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),signUpButton.widthAnchor.constraint(equalToConstant: 210),signUpButton.heightAnchor.constraint(equalToConstant: 45)
    ])
}

fileprivate func setupTermsOfUseButtonConstraints() {
    termsButton.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        termsButton.topAnchor.constraint(equalTo: signUpButton.bottomAnchor,termsButton.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),termsButton.widthAnchor.constraint(equalToConstant: 210),termsButton.heightAnchor.constraint(equalToConstant: 50),termsButton.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor)
    ])
}

这个问题让我发疯了好几天了!我想念什么?

解决方法

您的logoImageView被限制在错误的位置...

// constrain Top to scrollView contentLayoutGuide Top
//logoImageView.topAnchor.constraint(equalTo: scrollView.safeAreaLayoutGuide.topAnchor,constant: 16),logoImageView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor,

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...