1
votes

Comment créer un ViewController qui ne fait que la moitié de la hauteur de l'écran?

Je veux toutes les fonctionnalités d'un segment pageSheet UIModalPresentationStyle mais je veux seulement que le ViewController présenté affiche la moitié de l'écran (voir l'exemple dans l'image ci-dessous).

entrez la description de l'image ici

Je le présente de manière modale en utilisant le pageSheet modalPresentationStyle mais il le présente toujours à 100% de hauteur.

Je n'ai pas été en mesure de comprendre comment limiter ou modifier la hauteur d'un ViewController. J'ai essayé ce qui suit dans mon SecondViewController mais cela n'a pas fonctionné:

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.preferredContentSize = CGSize(width: self.view.frame.width, height: 400)
    }
} 

Je lance la suite avec Storyboard Segues, et un bouton qui la présente de manière modale: entrez la description de l'image ici


2 commentaires

Comment configurez-vous et présentez-vous le Modal ViewController?


@ZGski Bonne question, je viens de mettre à jour ma question avec les détails. J'ai actuellement un bouton sur le MainViewController qui, lorsqu'il est pressé, lance le modal.


3 Réponses :


0
votes

Pour ce faire, vous devrez sous-classer UIPresentationController et implémenter le protocole UIViewControllerTransitioningDelegate dans le contrôleur de présentation et définir transitioningDelegate et modalPresentationStyle du contrôleur de vue présenté comme self (contrôleur de vue de présentation) et .custom respectivement. Implémentez une fonction facultative de UIViewControllerTransitioningDelegate:

func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source _: UIViewController) -> UIPresentationController? {
        let presentationController = CustomPresentationController(presentedViewController: presented, presenting: presenting, presentedViewHeight: 100)
        return presentationController
    }

et renvoyez le presentationController personnalisé qui définit la hauteur du contrôleur présenté selon vos besoins.

Code de base qui pourrait aider:

class CustomPresentationController: UIPresentationController {
  var presentedViewHeight: CGFloat
  init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?, presentedViewHeight: CGFloat) {
        self.presentedViewHeight = presentedViewHeight
        super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
    }

  override var frameOfPresentedViewInContainerView: CGRect {
        var frame: CGRect = .zero
        frame.size = CGSize(width: containerView!.bounds.width, height: presentedViewHeight)
        frame.origin.y = containerView!.frame.height - presentedViewHeight
        return frame
    }
}

Implémentation de la fonction optionnelle:

func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source _: UIViewController) -> UIPresentationController?

Vous pouvez également jouer avec d'autres fonctions optionnelles et ajouter d'autres fonctionnalités à CustomPresentationController, telles que l'ajout d'un arrière - plan flou , l'ajout d'une fonctionnalité de toucher et d'un geste de balayage .


1 commentaires

merci d'avoir proposé la solution, j'ai manqué votre commentaire et résolu. Malheureusement, compte tenu du temps stupide que j'ai déjà passé là-dessus, je ne peux pas vraiment consacrer le temps de tester votre suggestion aujourd'hui, désolé, j'espère pouvoir bientôt.



0
votes

J'ai trouvé un moyen de le faire, ce que je trouve assez simple:

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let newView = UIView(frame: CGRect(x: 0, y: 500, width: self.view.frame.width, height: 400))
        newView.backgroundColor = .yellow
        newView.layer.cornerRadius = 20

        self.view = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))

        // self.view is now a transparent view, so now I add newView to it and can size it however, I like.

        self.view.addSubview(newView)


        // works without the tap gesture just fine (only dragging), but I also wanted to be able to tap anywhere and dismiss it, so I added the gesture below
        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        self.view.addGestureRecognizer(tap)
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
        dismiss(animated: true, completion: nil)
    }
}


0 commentaires

-1
votes

Nous pouvons ajouter notre vue dans UIActivityController et supprimer la vue par défaut de UIActivityController et si vous ajoutez un contrôleur de navigation, vous obtiendrez également la navigation, de sorte que vous puissiez réduire la moitié de votre contrôleur par ce code:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func actionPresent(_ sender: UIBarButtonItem) {
        let vc1 = storyboard?.instantiateViewController(withIdentifier: "ViewControllerCopy")
        let vc = ActivityViewController(controller: vc1!)
        self.present(vc, animated: true, completion: nil)
    }
}


class ActivityViewController: UIActivityViewController {

    private let controller: UIViewController!

    required init(controller: UIViewController) {
        self.controller = controller
        super.init(activityItems: [], applicationActivities: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let subViews = self.view.subviews
        for view in subViews {
            view.removeFromSuperview()
        }

        self.addChild(controller)
        self.view.addSubview(controller.view)
    }
}


1 commentaires

Au lieu de simplement publier un extrait de code, fournissez des détails sur ce qu'il fait et pourquoi ce code fonctionne.