web-dev-qa-db-fra.com

Arrière-plan transparent pour le contrôleur de vue à présentation modale

J'utilise Parse & ParseUI. Je souhaite que ma sous-classe PFLoginViewController ait un arrière-plan transparent. À l’avenir, je souhaite créer une vision floue sur l’arrière-plan.

Mais .... Une fois que l'animation du PFLoginViewController est terminée, l'arrière-plan devient noir ... Alors que pendant l'animation, l'arrière-plan était 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
        //
    }
}

La sous-classe utilisée par mon contrôleur principal:

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

    }

}

Comment puis-je le rendre transparent?

P.s. L'application de clearColor à backgroundColor dans la sous-classe ne fait aucune différence

51
P5ycH0

Fixe le.

Le problème était que presentViewController ne conserve pas la vue que je couvrais.

viewController.modalPresentationStyle = .overCurrentContext

a fait le tour.

126
P5ycH0

Une partie de la solution est cachée dans la question. Vous avez besoin de trois lignes pour rendre le fond transparent, à savoir. isOpaque = falsebackgroundColor = .clear & Configurez le modalPresentationStyle

Voici la solution complète. Dans le contrôleur de vue appelant, appelez cette fonction:

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

Et dans ModalViewControllerviewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()

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

identique à la réponse sélectionnée mais visuellement par IB:

enter image description here

22
Jesus Rodriguez

Au cas où quelqu'un aurait encore du mal à conserver un arrière-plan transparent, j'ai trouvé cette solution il y a quelque temps. Je ne me souviens plus où, mais cela fonctionne toujours très bien avec les dernières versions de Xcode et Swift.

ContactListViewController2: UIViewController, UITableViewDelegate, UITableViewDataSource,UIViewControllerTransitioningDelegate {

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    self.modalPresentationStyle = .custom
    self.transitioningDelegate = self
}
0
Jeremy Andrews