How to remove background programmatically?

Hi, I have a UIView setup programmatically, I have recently set a background image, this show's for a second and when the view has actually loaded, a black solid colour covers it, even though there isn't a background colour set?! Can anyone help? Thanks john

import UIKit
import Firebase
class LoginController: UIViewController {
   
    var messagesController: MessagesController?
   
    let inputsContainerView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.white
        view.translatesAutoresizingMaskIntoConstraints = false
        view.layer.cornerRadius = 5
        view.layer.masksToBounds = true
        return view
    }()
   
    lazy var loginRegisterButton: UIButton = {
        let button = UIButton(type: .system)
        button.backgroundColor = UIColor(r: 80, g: 101, b: 161)
        button.setTitle("Register", for: UIControlState())
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitleColor(UIColor.white, for: UIControlState())
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
       
        button.addTarget(self, action: #selector(handleLoginRegister), for: .touchUpInside)
       
        return button
    }()
   
    func handleLoginRegister() {
        if loginRegisterSegmentedControl.selectedSegmentIndex == 0 {
            handleLogin()
        } else {
            handleRegister()
        }
    }
   
    func handleLogin() {
        guard let email = emailTextField.text, let password = passwordTextField.text else {
            print("Form is not valid")
            return
        }
       
        Auth.auth().signIn(withEmail: email, password: password, completion: { (user, error) in
           
            if error != nil {
                print(error)
                return
            }
           
            /
           
            self.messagesController?.fetchUserAndSetupNavBarTitle()
           
            self.dismiss(animated: true, completion: nil)
           
        })
       
    }
   
    let nameTextField: UITextField = {
        let tf = UITextField()
        tf.placeholder = "Name"
        tf.translatesAutoresizingMaskIntoConstraints = false
        return tf
    }()
   
    let nameSeparatorView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor(r: 220, g: 220, b: 220)
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
   
    let emailTextField: UITextField = {
        let tf = UITextField()
        tf.placeholder = "Email"
        tf.translatesAutoresizingMaskIntoConstraints = false
        return tf
    }()
   
    let emailSeparatorView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor(r: 220, g: 220, b: 220)
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
   
    let passwordTextField: UITextField = {
        let tf = UITextField()
        tf.placeholder = "Password"
        tf.translatesAutoresizingMaskIntoConstraints = false
        tf.isSecureTextEntry = true
        return tf
    }()
   
    lazy var profileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "lost")
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.contentMode = .scaleAspectFill
       
        imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
        imageView.isUserInteractionEnabled = true
       
        return imageView
    }()
   
    lazy var backgroundImageView: UIImageView = {
        let bgimageView = UIImageView()
        bgimageView.image = UIImage(named: "worthingpier")
        bgimageView.translatesAutoresizingMaskIntoConstraints = false
        bgimageView.contentMode = .scaleAspectFill
       
        bgimageView.isUserInteractionEnabled = true
       
        return bgimageView
    }()
   
    lazy var loginRegisterSegmentedControl: UISegmentedControl = {
        let sc = UISegmentedControl(items: ["Login", "Register"])
        sc.translatesAutoresizingMaskIntoConstraints = false
        sc.tintColor = UIColor.white
        sc.selectedSegmentIndex = 1
        sc.addTarget(self, action: #selector(handleLoginRegisterChange), for: .valueChanged)
        return sc
    }()
   
    func handleLoginRegisterChange() {
        let title = loginRegisterSegmentedControl.titleForSegment(at: loginRegisterSegmentedControl.selectedSegmentIndex)
        loginRegisterButton.setTitle(title, for: UIControlState())
       
        /
        inputsContainerViewHeightAnchor?.constant = loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 100 : 150
       
        /
        nameTextFieldHeightAnchor?.isActive = false
        nameTextFieldHeightAnchor = nameTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 0 : 1/3)
        nameTextFieldHeightAnchor?.isActive = true
       
        emailTextFieldHeightAnchor?.isActive = false
        emailTextFieldHeightAnchor = emailTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 1/2 : 1/3)
        emailTextFieldHeightAnchor?.isActive = true
       
        passwordTextFieldHeightAnchor?.isActive = false
        passwordTextFieldHeightAnchor = passwordTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 1/2 : 1/3)
        passwordTextFieldHeightAnchor?.isActive = true
    }
   
    override func viewDidLoad() {
        super.viewDidLoad()
       
        /
        self.view.backgroundColor = UIColor.black.withAlphaComponent(0.0)
        view.addSubview(inputsContainerView)
        view.addSubview(loginRegisterButton)
        view.addSubview(profileImageView)
        view.addSubview(loginRegisterSegmentedControl)
        view.addSubview(backgroundImageView)
       
       
        setupInputsContainerView()
        setupLoginRegisterButton()
        setupBackgroundImageView()
        setupProfileImageView()
        setupLoginRegisterSegmentedControl()
       
        view.backgroundColor = UIColor.clear
       
    }
   
    func setupLoginRegisterSegmentedControl() {
        /
        loginRegisterSegmentedControl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        loginRegisterSegmentedControl.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor, constant: -12).isActive = true
        loginRegisterSegmentedControl.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor, multiplier: 1).isActive = true
        loginRegisterSegmentedControl.heightAnchor.constraint(equalToConstant: 36).isActive = true
    }
   
    func setupProfileImageView() {
        /
        profileImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        profileImageView.bottomAnchor.constraint(equalTo: loginRegisterSegmentedControl.topAnchor, constant: -12).isActive = true
        profileImageView.widthAnchor.constraint(equalToConstant: 150).isActive = true
        profileImageView.heightAnchor.constraint(equalToConstant: 150).isActive = true
    }
   
    func setupBackgroundImageView() {
        /
        backgroundImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        backgroundImageView.bottomAnchor.constraint(equalTo: view.topAnchor, constant: -64).isActive = true
        backgroundImageView.widthAnchor.constraint(equalToConstant: 375).isActive = true
        backgroundImageView.heightAnchor.constraint(equalToConstant: 603).isActive = true
    }
   
    var inputsContainerViewHeightAnchor: NSLayoutConstraint?
    var nameTextFieldHeightAnchor: NSLayoutConstraint?
    var emailTextFieldHeightAnchor: NSLayoutConstraint?
    var passwordTextFieldHeightAnchor: NSLayoutConstraint?
   
    func setupInputsContainerView() {
        /
        inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -24).isActive = true
        inputsContainerViewHeightAnchor = inputsContainerView.heightAnchor.constraint(equalToConstant: 150)
        inputsContainerViewHeightAnchor?.isActive = true
       
        inputsContainerView.addSubview(nameTextField)
        inputsContainerView.addSubview(nameSeparatorView)
        inputsContainerView.addSubview(emailTextField)
        inputsContainerView.addSubview(emailSeparatorView)
        inputsContainerView.addSubview(passwordTextField)
       
        /
        nameTextField.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: 12).isActive = true
        nameTextField.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
       
        nameTextField.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
        nameTextFieldHeightAnchor = nameTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/3)
        nameTextFieldHeightAnchor?.isActive = true
       
        /
        nameSeparatorView.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor).isActive = true
        nameSeparatorView.topAnchor.constraint(equalTo: nameTextField.bottomAnchor).isActive = true
        nameSeparatorView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
        nameSeparatorView.heightAnchor.constraint(equalToConstant: 1).isActive = true
       
        /
        emailTextField.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: 12).isActive = true
        emailTextField.topAnchor.constraint(equalTo: nameTextField.bottomAnchor).isActive = true
       
        emailTextField.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
       
        emailTextFieldHeightAnchor = emailTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/3)
       
        emailTextFieldHeightAnchor?.isActive = true
       
        /
        emailSeparatorView.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor).isActive = true
        emailSeparatorView.topAnchor.constraint(equalTo: emailTextField.bottomAnchor).isActive = true
        emailSeparatorView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
        emailSeparatorView.heightAnchor.constraint(equalToConstant: 1).isActive = true
       
        /
        passwordTextField.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: 12).isActive = true
        passwordTextField.topAnchor.constraint(equalTo: emailTextField.bottomAnchor).isActive = true
       
        passwordTextField.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
        passwordTextFieldHeightAnchor = passwordTextField.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/3)
        passwordTextFieldHeightAnchor?.isActive = true
    }
   
    func setupLoginRegisterButton() {
        /
        loginRegisterButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        loginRegisterButton.topAnchor.constraint(equalTo: inputsContainerView.bottomAnchor, constant: 12).isActive = true
        loginRegisterButton.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
        loginRegisterButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
    }
   
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
extension UIColor {
   
    convenience init(r: CGFloat, g: CGFloat, b: CGFloat) {
        self.init(red: r/255, green: g/255, blue: b/255, alpha: 1)
    }
   
}

Replies

In viewDidLoad, you have set to black:

self.view.backgroundColor = UIColor.black.withAlphaComponent(0.0)

Can you comment this out and see ?


If no effect, may be there is a view hiding it.


I would suggest the following :

In IB, turn all views other than this background image to isHidden = true.


Does the view remain visible ?


If so, progressively unhide the views one by one, until the problem occurs again.


You will know where to search.

I just tried this

inputsContainerView.isHidden = true
        loginRegisterSegmentedControl.isHidden = true
        profileImageView.isHidden = true
        loginRegisterSegmentedControl.isHidden = true
        loginRegisterButton.isHidden = true
        backgroundImageView.isHidden = false

and still it flashes up and then goes black?!

think it may be a layer issue?!

And did you try to delete

self.view.backgroundColor = UIColor.black.withAlphaComponent(0.0)


Even if it should be transparent, let's try.

hmm it's not having it.... thanks anyway Claude31, I might just put the logo on the view instead of a background image?! bit frustrating though

I tracked you problem. It comes from:


        backgroundImageView.bottomAnchor.constraint(equalTo: view.topAnchor, constant: -64).isActive = true


If you comment this out, you will see the image is there, no more black screen.

Seems you are moving the image offscreen (above the top of the view by 64), and there is only a black content to display (from the image plane).


If you change -64 in 64, you'll see a part of the view ; but the bottom is black


I'm surprised also that you add this backgroundview in last order. That hides the other subviews.


Edited:

if you delete

       self.view.backgroundColor = UIColor.black.withAlphaComponent(0.0)


Then there is no more black background.


To make it more visible, you should test with UIColor.yellow


if you replace with :

self.view.backgroundColor = UIColor.yellowColor().colorWithAlphaComponent(0.0)

Then you get a black background

with :

self.view.backgroundColor = UIColor.yellowColor().colorWithAlphaComponent(0.5)

you get a brown (mix yellow and black) background

with :

self.view.backgroundColor = UIColor.yellowColor().colorWithAlphaComponent(1.0)

you get a yellow background, equivalent to:

self.view.backgroundColor = UIColor.yellowColor()


So, even with alpha 0.0, whatever the color, they is an underneath black layer created, that is partially masked by the alpha color.