Transparent background for modally presented viewcontroller

SwiftParse Platformios8.1

Swift Problem Overview


I am using Parse & ParseUI. I want my PFLoginViewController subclass to have a transparent background. In the future, I want to lay a blurred view over the background.

But.... Once the animate-in of the PFLoginViewController is done, the background turns black... Whilst during the animation the background was transparent.

func presentLogin() {
	var loginViewController = LoginViewController()
	var signupViewController = SignUpViewController()

	loginViewController.fields = .UsernameAndPassword | .LogInButton | .PasswordForgotten | .SignUpButton | PFLogInFields.DismissButton
	signupViewController.fields = .UsernameAndPassword | .Email	| .DismissButton | .SignUpButton
	loginViewController.delegate = self
	loginViewController.logInView.backgroundColor = UIColor.clearColor()
	loginViewController.logInView.opaque = false
	signupViewController.delegate = self

	loginViewController.signUpController = signupViewController

	self.presentViewController(loginViewController, animated: true) { () -> Void in
		//
	}
}

My logincontroller's used subclass:

class LoginViewController: PFLogInViewController {

    @IBOutlet weak var _nmcLogoLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

    	// Do any additional setup after loading the view.
    	let userName = SettingsManager.userName
    	let password = SettingsManager.password

		self.logInView.usernameField.text = userName
		self.logInView.passwordField.text = password

		NSBundle.mainBundle().loadNibNamed("LoginViewBranding", owner: self, options: nil)[0] as? UIView
	
		self.logInView.logo = _nmcLogoLabel

    }

}

How can I make it transparent?

P.s. Applying the clearColor to the backgroundColor in the subclass makes no difference

Swift Solutions


Solution 1 - Swift

Fixed it.

The problem was that presentViewController does not keep the view that I was covering.

viewController.modalPresentationStyle = .overCurrentContext

did the trick.

Solution 2 - Swift

Part of the solution is hidden in the question. You need three lines to make the background transparent, viz. isOpaque = false backgroundColor = .clear & set the modalPresentationStyle

Here's the full solution. In the calling View Controller, call this function:

func presentModal() {
    let modalController = ModalViewController()
    modalViewController.modalPresentationStyle = .overCurrentContext
    present(modalViewController, animated: true, completion: nil)
}

And in ModalViewController's viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()

    view.isOpaque = false
    view.backgroundColor = .clear // try other colors, say: .white or black with Alpha etc.
}

Solution 3 - Swift

same as the selected answer but visually through IB:

enter image description here

Solution 4 - Swift

I have two view controller 1st login & 2nd forgot password. Initially, the login screen has been visible on the tap of forgot password button, forgot password screen will be present over the login screen with a transparent background.

In the Login screen, I have used following code for forgotButtonAction to present forgotPasswordViewController

   let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "forgotPasswordViewController") as! forgotPasswordViewController
    vc.modalPresentationStyle = .overCurrentContext
    present(vc, animated: true, completion: nil)

And also in the forgotPasswordViewController, Under the ViewDidLoad method, I have to change the view background color and opaque state through the following code

   override func viewDidLoad() {
    super.viewDidLoad()
    view.isOpaque = false
    view.backgroundColor = .clear
   }

Solution 5 - Swift

In case anyone is still struggling with a transparent background I found this solution some time ago - I can't remember where but still works fine with the latest Xcode & Swift.

ContactListViewController2: UIViewController, UITableViewDelegate, UITableViewDataSource,UIViewControllerTransitioningDelegate {

required init?(coder aDecoder: NSCoder) {
	super.init(coder: aDecoder)
	
	self.modalPresentationStyle = .custom
	self.transitioningDelegate = self
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTycho PandelaarView Question on Stackoverflow
Solution 1 - SwiftTycho PandelaarView Answer on Stackoverflow
Solution 2 - SwiftNitin NainView Answer on Stackoverflow
Solution 3 - SwiftJesus RodriguezView Answer on Stackoverflow
Solution 4 - SwiftAshutosh MishraView Answer on Stackoverflow
Solution 5 - SwiftJeremy AndrewsView Answer on Stackoverflow