Je souhaite créer un petit popover sur 50x50px
à partir d'une UIButton
. J'ai vu des méthodes en utilisant adaptive segue's mais j'ai mes classes de taille tourner donc signifiant que je ne peux pas utiliser cette fonctionnalité!
Sinon, comment puis-je créer ce popover? Puis-je le créer avec du code dans mon bouton IBACtion
? Ou est-il encore possible de faire cela avec des storyboards?
Vous pouvez effectuer l’une des deux options suivantes:
Créez une action pour la UIButton
dans votre UIViewController
et dans celle-ci présentez la ViewController
que vous voulez comme une fenêtre popover et votre UIViewController
doit implémenter le protocole UIPopoverPresentationControllerDelegate
, regardez dans le code suivant:
@IBAction func showPopover(sender: AnyObject) {
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("StoryboardIdentifier") as! UIViewController
popoverContent.modalPresentationStyle = .Popover
var popover = popoverContent.popoverPresentationController
if let popover = popoverContent.popoverPresentationController {
let viewForSource = sender as! UIView
popover.sourceView = viewForSource
// the position of the popover where it's showed
popover.sourceRect = viewForSource.bounds
// the size you want to display
popoverContent.preferredContentSize = CGSizeMake(200,500)
popover.delegate = self
}
self.presentViewController(popoverContent, animated: true, completion: nil)
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
Selon le livre de @mattProgrammation iOS 8:
Un contrôleur de présentation popover, dans iOS 8, est un contrôleur de présentation (
UIPresentationController
), et les contrôleurs de présentation sont adaptatifs. Cela signifie que, par défaut, dans un environnement compact horizontalement (par exemple sur un iPhone), le style de présentation modal.Popover
sera traité comme étant.FullScreen
. Ce qui apparaît en popover sur l'iPad apparaîtra sous la forme d'une vue présentée en plein écran sur l'iPhone, remplaçant complètement l'interface.
Pour éviter ce problème dans l'iPhone, vous devez implémenter la méthode de délégué adaptivePresentationStyleForPresentationController
dans votre UIViewController
pour afficher correctement le Popover.
L’autre façon, à mon avis, est plus facile à faire et utilise Interface Builder. Organisez-vous simplement à partir de la variable UIButton
afin de créer une transition vers la variable ViewController
souhaitée et sélectionnez ensuite la transition Popover
.
J'espère que cela vous aidera.
Swift 4 Voici un code totalement opérationnel. Donc, ici, vous verrez une fenêtre popup avec une taille de 250x250:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// in case if you don't want to make it via IBAction
button.addTarget(self, action: #selector(tapped), for: .touchUpInside)
}
@objc
private func tapped() {
guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") else { return }
popVC.modalPresentationStyle = .popover
let popOverVC = popVC.popoverPresentationController
popOverVC?.delegate = self
popOverVC?.sourceView = self.button
popOverVC?.sourceRect = CGRect(x: self.button.bounds.midX, y: self.button.bounds.minY, width: 0, height: 0)
popVC.preferredContentSize = CGSize(width: 250, height: 250)
self.present(popVC, animated: true)
}
}
// This is we need to make it looks as a popup window on iPhone
extension ViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
}
Notez que vous devez fournir l'identifiant popVC à l'un des viewController que vous souhaitez présenter sous forme de popup.
J'espère que cela pourra aider!
Ici, vous pouvez présenter un popover sur un clic de bouton.
func addCategory( _ sender : UIButton) {
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(50,50)
popover.delegate = self
popover.sourceView = sender
popover.sourceRect = sender.bounds
self.presentViewController(nav, animated: true, completion: nil)
}
Swift 4 Version
Fait le plus de travail à partir du storyboard
J'ai ajouté un ViewController
, je suis allé à son inspecteur d'attributs et j'ai coché la case "Utiliser la taille explicite préférée". Après cela, j'ai changé les valeurs de largeur et de hauteur à 50 chacun.
Une fois que cela a été fait, j'ai cliqué et glissé du bouton vers la variable ViewController
que j'ai ajoutée en choisissant "Present as Popover" et en nommant l'identifiant de séquence comme "pop".
Je suis allé à la ViewController
où j'avais mon bouton et ajouté le code suivant:
class FirstViewController: UIViewController, UIPopoverPresentationControllerDelegate {
@IBOutlet weak var popoverButton: UIButton! // the button
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "pop" {
let popoverViewController = segue.destination
popoverViewController.modalPresentationStyle = .popover
popoverViewController.presentationController?.delegate = self
popoverViewController.popoverPresentationController?.sourceView = popoverButton
popoverViewController.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: popoverButton.frame.size.width, height: popoverButton.frame.size.height)
}
}
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
override func viewDidLoad() {
super.viewDidLoad()
}
}