问题
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
回答1:
Fixed it.
The problem was that presentViewController does not keep the view that I was covering.
viewController.modalPresentationStyle = .overCurrentContext
did the trick.
回答2:
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.
}
回答3:
same as the selected answer but visually through IB:
回答4:
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
}
来源:https://stackoverflow.com/questions/27669699/transparent-background-for-modally-presented-viewcontroller