微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有自动布局的UIScrollView不滚动

如何解决具有自动布局的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,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。