[Résolu] Déplacer un UIPopover sans qu'il clignote

busterTheobusterTheo Membre
avril 2015 modifié dans API UIKit #1

Bonjour à  tous,


voilà , je me pose une question. En swift.


 


J'essaie de faire un truc comme l'outil de pagination (en bas des pages) dans l'appli iBooks de Apple, et je n'ai rien trouvé sur le web, qui en parle.


 


J'ai essayé avec un UIPopover. Puisque j'aurais besoin de placer dans le popup des informations (images, etc.) concernant les pages en questions.


 


Pour que le UIPopover se déplace avec mon slider perso (géré avec un UIPangestureRecognizer), je dois faire un dismissPopoverAnimated, pour le masquer et le réafficher, sinon il ne se déplace pas avec le curseur du slider, et j'aurai l'erreur citée plus bas.


 


Y'a une petite vidéo démo ici, avec le message d'erreur aléatoire, à  la fin de la vidéo.


 


J'ai deux petits soucis :


 


1- Il disparait et se réaffiche (normal), mais j'aimerai en fait qu'il ne disparaisse pas (donc pas de dismiss). Mais dans ce cas, il ne se déplace plus, et, évidemment j'ai l'erreur suivante :


 



 


Warning: Attempt to dismiss from view controller while a presentation or dismiss is in progress!



 


2- Si je fais le dismiss avec le test sur le popoverVisible == true, j'ai quand même de temps en temps la même erreur (ça, c'est carrément bizarre), et évidemment il disparait - Ce que je ne désire pas.


 


J'ai cherché un peu du côté de UIAlertController, mais je pense que cela n'est pas fait pour ça.


 


Voici mon code :



var popController: UIPopoverController!
var labelPopover: UILabel!
var framePopover: CGRect!

Et plus loin, le fonction appelée par le pan :



func panSlider(recognizer: UIPanGestureRecognizer) {
let pan = recognizer as UIPanGestureRecognizer

switch(pan.state) {
case .Began:
let recognizerX = recognizer.locationInView(self.view).x as CGFloat
case .Changed:
let recognizerX = recognizer.locationInView(self.view).x as CGFloat

if (recognizerX - orignX)/10 <= 8 && (recognizerX - orignX)/10 >= -8 {
myRoundCurseurRotateView.frame.origin.x = recognizerX

framePopover = CGRectMake(myRoundCurseurRotateView.frame.origin.x, myRoundCurseurRotateView.frame.origin.y + 60, myRoundCurseurRotateView.frame.width, myRoundCurseurRotateView.frame.height)
showPopView()
}
case .Ended:
let recognizerX = recognizer.locationInView(self.view).x as CGFloat
default:
break
}
}

Et la fonction showPopView appelée lors du déplacement changed :



func showPopView() {

if popController?.popoverVisible == true {
popController?.dismissPopoverAnimated(true)
} else {

//Le UIViewController qui ira dans le UIPopOverController
var popViewController: UIViewController = UIViewController()

//Le UIPopOverController qui contient le UIViewController - LE POPUP
popController = UIPopoverController(contentViewController: popViewController)
popController.backgroundColor = UIColor(red: 1.0, green: 0.9, blue: 1.0, alpha: 1.0)

//La View qui ira dans le UIViewController
var popView: UIView = UIView(frame: CGRectMake(0, 0, 200, 300))

//On relie la view au viewController
popViewController.view.addSubview(popView)

//Du contenu dans la view
labelPopover = UILabel(frame: CGRectMake(20, 25, 80, 20))
labelPopover.text = "Mon popover"
labelPopover.textColor = UIColor.blueColor()
labelPopover.backgroundColor = UIColor.whiteColor()
labelPopover.textAlignment = NSTextAlignment.Center
popView.addSubview(labelPopover)

popController.popoverContentSize = CGSize(width: 250, height: 400)
popController.presentPopoverFromRect(framePopover, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Down, animated: true)
}
}

Quelqu'un a-t-il une idée ?

 

Merci d'avance.

 


 


 


 


 


 


 


 


Réponses

  • CéroceCéroce Membre, Modérateur
    avril 2015 modifié #2
    Apple ne fait certainement pas ainsi. Ils déplacent le popover.
    Tu pourrais essayer de jouer sur sa frame mais ça me parait une mauvais idée: tu n'as pas le contrôle sur l'affichage, et même si ça fonctionne aujourd'hui, ça peut ne plus marcher dans une prochaine version d'iOS.

    Prends le contrôle !
    Le plus simple est de créer ton propre pop-over avec une UIImageView.
    Ajoute-y les labels en vues filles.
    Déplace la frame de l'ImageView, selon la position du doigt.

    Je suis presque sûr qu'Apple fait ainsi dans iBooks.
  • Ouais, je pense que t'as raison. J'ai fait pareil pour le slider, ce sera un perso.


    Merci pour tes conseils.


     


    Je remettrai mon code avec une vidéo, pour ceux que ça intéressent, lorsque je l'aurais fait.


     


    :p


Connectez-vous ou Inscrivez-vous pour répondre.