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).
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:
3 Réponses :
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 .
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.
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) } }
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) } }
Au lieu de simplement publier un extrait de code, fournissez des détails sur ce qu'il fait et pourquoi ce code fonctionne.
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.