[Résolu] Un UIPageViewController avec views différentes sur le storyboard

busterTheobusterTheo Membre
mai 2015 modifié dans API UIKit #1

Bonjour à  tous,


en gros, je dois faire un pageViewController avec plusieurs views (et leur controller respectif) différentes.


 


Donc pas comme ici, car dans ce cas toutes les pages ont le même contenu (une image et un title).


 


Moi je dois avoir des pages totalement différentes avec leur controller associé totalement dédié.


 


Je me suis donc inspiré de ce post fantastique, que j'ai du adapter (quelques erreurs, et le contexte), tout en recopiant mot pour mot le code, non pas pour pomper, mais comme je galèrais à  l'adapter au mien, je voulais déjà  vérifier qu'il fonctionnait bien.


 


Il fonctionne parfaitement. Je me suis fais 4 pages avec juste une couleur de fond différentes pour bien les identifier.


 


 


Alors j'ai quelques questions :


 


 


 


 


 


1- Cela concerne le fait que si je garde dans la fonction suivante (appelé dans le viewDidload) :



 


createPageViewController()



 


le code suivant :



let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController

je ne parviens pas à  faire une transition autre que la ".PageCurl" qui semble être par défaut.


 


Pour faire une transition ".Scroll", je dois faire le code suivant (à  la place du précédent) :



let pageController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil )

Et là , ça fonctionne avec le ".Scroll".


 


Y-a-t-il une façon de faire la transition ".Scroll" en conservant l'accès au UIPageViewController du storyboard ?


 


Et sinon, à  quoi sert de placer un UIPageViewController dans le storyboard si je ne le cible pas ?


 


 


 


 


 


 


 


 


 


 


2- Ensuite, si je met en commentaire l'appel de la fonction :



 


setupPageControl()



 


dans le viewDidLoad, j'ai une barre blanche en bas de l'écran. Normal, puisque cet espace semble réservé au UIPageControl.


Donc si je le remet, j'ai bien mon UIPageControl en bas de l'écran, qui occupe l'espace vide réservé à  cet effet.


 


Mais moi, j'aurai besoin de le placer en haut de mon écran. Enfin, pas tout-à -fait en haut, mais à  un emplacement précis.


 


J'ai tout essayé : placer un UIPageControl dans le storyboard, ou bien le placer en code (comme plus bas), et plein d'autres choses inintéressantes :




var pageControl:UIPageControl = UIPageControl()


pageControl = UIPageControl(frame: CGRectMake(0,0,1024,300))


self.view.addSubview(pageControl)


Et si je remplace :



let appearance = UIPageControl.appearance()

par :



let appearance = pageControl.appearance()

j'ai l'erreur suivante :



 


UIPageControl' does not have a member named 'appearance'



C'es un comble !


 


Donc, rien n'y fait... Il reste en bas et parfait d;-)


 


 


 


 


 


 


 


 


 


3- Et si j'y parvenais (je ne sais pas encore comment), - Comment supprimer l'espace blanc réservé à  cet effet ?


 


 


 


 


 


 


 


 


 


En résumé :


 


1- Le .Scroll et l'accès par :



instantiateViewControllerWithIdentifier

2- Un UIPageControll en position perso


3- L'espace blanc en bas de l'écran


 


 


 


 


 


 


 


 


Voilà , merci d'avance pour vos remarques. En tout cas, ce lien (le même que plus haut) me semble quand même excellent.


 


Amicalement  :p


Réponses

  • busterTheobusterTheo Membre
    mai 2015 modifié #2

    Là , chui bluffé,


    ou mon post est débile, ou personne ne sait (chose dont je doute), ou plutôt, manque de temps, chose que je comprend grave...


    Merci pour tous ceux (23) qui ont pris le temps de lire.


  • samirsamir Membre


     


    1- Le .Scroll et l'accès par :



    instantiateViewControllerWithIdentifier



     


     


    Si tu prends les deux lignes :



    let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController


    let pageController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil )

    la première initialisation te crée un pageController avec un identifiant que tu passe en paramètre, mais le reste des paramèrtes sont mis par défaut. ( il se trouve que valeur du scoop par défaut est l'animation curl).


    par contre le pageController expose dans son API une proprette qui va te permettre de le configurer a la fin de son initlaisation.


     


    donc tu peux faire un truc du genre :



    pageController.transitionStyle = UIPageViewControllerTransitionStyle.Scroll;

    2. 


    .....


     


    Plus tard ( manger :)).

  • busterTheobusterTheo Membre
    mai 2015 modifié #4

    Ben j'avais déjà  essayer, off course, mais ça ne fonctionne pas


    J'ai l'erreur suivante


     



    Cannot assign to 'transitionStyle' in 'pageController'



    J'ai tenté également



    pageController.transitionStyle = .Scroll

    qui donne cette erreur



    Cannot assign to the result of this expression



    si je déclare dans mes variables (et évidemment que je vire le "let"



    var pageController: UIPageViewController! 

    et



    pageController.transitionStyle: UIPageViewControllerTransitionStyle = UIPageViewControllerTransitionStyle.Scroll

    et



    pageController.transitionStyle: UIPageViewControllerTransitionStyle = .Scroll

    Je suis d'accord, y'a un truc inexplicable


     


     


    Merci pour ta proposition


     


    Et bonAp...


  • busterTheobusterTheo Membre
    mai 2015 modifié #5

    Bon, après plusieurs heures de galère, ça progresse, c'est quand même bien chiant ce truc.


    Et j'ai encore quelques soucis (voir plus bas).


     


     


    Je rappelle que le but était de me faire un UIPageControl perso positionné où je le désire.


     


    Voilà  le code :



    class ViewController: UIViewController, UIPageViewControllerDataSource {

    // MARK: - Variables

    var pageViewController: UIPageViewController!
    var pageItemController: PageItemController?

    var controllers = [PageItemController]()

    var pageControl: UIPageControl!

    // MARK: - View Lifecycle

    override func viewDidLoad() {
    super.viewDidLoad()
    populateControllersArray()
    createPageViewController()
    setupPageControl()
    }

    func populateControllersArray() {
    for i in 0...3 {
    let controller = storyboard!.instantiateViewControllerWithIdentifier("ViewControllerSB\(i+1)") as PageItemController
    controller.itemIndex = i
    controllers.append(controller)
    }
    }

    func createPageViewController() {
    let pageController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil )

    pageController.dataSource = self

    if !controllers.isEmpty {
    pageController.setViewControllers([controllers[0]], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    }

    pageViewController = pageController
    addChildViewController(pageViewController!)
    self.view.addSubview(pageViewController!.view)
    pageViewController!.didMoveToParentViewController(self)
    }

    func setupPageControl() {
    pageControl = UIPageControl(frame: CGRectMake(475,45,86,25))
    self.view.addSubview(pageControl)

    pageControl.currentPage = 0
    pageControl.numberOfPages = controllers.count

    pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
    pageControl.currentPageIndicatorTintColor = UIColor.darkGrayColor()
    pageControl.backgroundColor = UIColor.clearColor()
    }

    etc.

    Puis pour le swipe qui modifie les dots :


    // MARK: - UIPageViewControllerDataSource

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    if let controller = viewController as? PageItemController {
    if controller.itemIndex > 0 {
    pageControl.currentPage = controller.itemIndex
    return controllers[controller.itemIndex - 1]
    } else {
    pageControl.currentPage = 0
    }
    }
    return nil
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    if let controller = viewController as? PageItemController {
    if controller.itemIndex < controllers.count - 1 {
    pageControl.currentPage = controller.itemIndex
    return controllers[controller.itemIndex + 1]
    } else {
    pageControl.currentPage = controllers.count
    }
    }
    return nil
    }

    Déjà , c'est pas mal.


     


     


    Maintenant le problème est que j'ai toujours la barre blanche en bas, réservée au UIPageControl par défaut du UIPageViewController.


     


    Quelqu'un aurait-il l'idée géniale pour la supprimer ?


     


    La p'tite vidéo


     


     


    Merci d'avance


  • Désolé pour la copie du code, en fait re-copier-coller dans la fenêtre de code fait que on a les couleurs de Xcode (ça, je trouve ça cool), mais on n'est plus dans la zone de code - oups


  • Joanna CarterJoanna Carter Membre, Modérateur


    Désolé pour la copie du code, en fait re-copier-coller dans la fenêtre de code fait que on a les couleurs de Xcode (ça, je trouve ça cool), mais on n'est plus dans la zone de code - oups




    Reglé

  • busterTheobusterTheo Membre
    mai 2015 modifié #8

    Ah super, comment t'as fait ça ?


     


    Et c'est bien en couleur non ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    J'ai modifié le message, couper le code, introduit les nouvelles sections balisées et collé le code là  dedans.


  • Tout simplement.


     


    Merci.


  • samirsamir Membre


    Maintenant le problème est que j'ai toujours la barre blanche en bas, réservée au UIPageControl par défaut du UIPageViewController.


     


    Quelqu'un aurait-il l'idée géniale pour la supprimer ?




     


    Je suppose que le UIPageViewController reserve une vue pour les pageControl dès que il trouve que tu as implémenter les méthode du dataSource : 



    optional func presentationCountForPageViewController(_ pageViewController:UIPageViewController) -> Int


    optional func presentationIndexForPageViewController(_ pageViewController:UIPageViewController) -> Int

    As-tu implémenté ces méthodes ?

  • Salut Samir,


    ben oui, elles sont implémentés, et du coup, je viens de comprendre (grâce à  ton explication), je les ai supprimées, et effectivement, la barre blanche a disparue.


     


    Génial. Je vais pouvoir me concentrer à  intégrer tout ce truc dans mon projet.


     


    Merci à  tous. Je met résolu


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