web-dev-qa-db-fra.com

Swift/iOS8: Pourquoi les indicateurs de contrôle de page ne sont-ils pas affichés?

J'implémente un contrôleur de vue de galerie simple dans lequel l'application affiche une petite plage d'images plein écran que l'utilisateur peut faire défiler. J'utilise UIPageViewController qui, selon moi, devrait afficher automatiquement les indicateurs de contrôle de page si j'implémente les fonctions de source de données appropriées. Cependant, je ne vois toujours aucun indicateur.

Dans ma GalleryViewController principale:

class GalleryViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

var pageController: UIPageViewController?
var pageContent = NSArray()

override func viewDidLoad() {
super.viewDidLoad()
.... some code to load images into the pageContent array ....

pageController = UIPageViewController(transitionStyle:.Scroll, navigationOrientation:.Horizontal,options:nil) 
pageController?.delegate = self
pageController?.dataSource = self

... some more standard code to add the page controller to self.view etc.

var pageControl = UIPageControl.appearance()
pageControl.pageIndicatorTintColor = UIColor.lightGray()
pageControl.currentPageIndicatorTintColor = UIColor.whiteColor()
pageControl.backgroundColor = UIColor.blackColor()

pageController!.didMoveToParentViewController(self)
}

func viewControllerAtIndex(index:Int) -> ContentViewController? {
....
}

J'ai mis en œuvre les deux méthodes de protocole obligatoires viewControllerBeforeViewController et viewControllerAfterController ainsi que les deux méthodes requises pour la pagination, presentationCountForPagesViewController et presentationIndexForPageViewController.

Ma ContentViewController a une UIImageView qui remplit tout l'écran. Cependant, même si je diminue sa taille en bas de l'écran, je ne vois aucun indicateur de page s'allumer. Ai-je oublié quelque chose ici? Faites-moi savoir si je n'ai pas fourni suffisamment d'informations. J'ai essayé de réécrire une de mes anciennes applications que j'avais codée en Objective-C il y a plus de 5 ans - entièrement en Swift pour iOS8 et Xcode, etc. a tellement changé que c'est déroutant. Merci!

11
Pompey Casmilus

Tiré de ici :

Pour afficher UIPageControl, vous devez implémenter deux méthodes de source de données facultatives. Il suffit de renvoyer le nombre entier de pages pour presentationCountForPageViewController et l'index initialement sélectionné pour presentationIndexForPageViewController.

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return pageContent.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return 0
}
22
Zell B.

Pourquoi ne pas utiliser Swift 3+ version de Zell B. 's answer

    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return self.providerItemList?.providerItems?.count ?? 0
    }

    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return 0
    }
20

Même si vous changez la couleur de UIPageControl, celle-ci peut ne pas apparaître. Si UIPageController est à l'intérieur de UITabBarController, TabBar couvrira UIPageControl. Le meilleur moyen de le trouver est d'utiliser l'option Debug-> View Debubging-> CaptureViewHierarchy . Puis dans le champ de filtre en bas à gauche, tapez "pageControl". Si vous cliquez dessus dans le navigateur, il devrait le localiser à l'écran (regardez la capture d'écran)

 enter image description here

Vous pouvez changer la position comme ceci:

let controlHeight: CGFloat = 50
    let bottomSpace: CGFloat = 20
    let yPosition = view.frame.size.height - (controlHeight + bottomSpace)
    let fullScreenWidth = view.frame.size.width
    let frame = CGRect(x: 0, y: yPosition, width: fullScreenWidth, height: controlHeight)

    pageControl.frame = frame
10
milczi

Bien que la réponse apparaisse abondamment dans bon nombre de ces réponses, je tiens simplement à préciser explicitement que vous devez définir UIPageViewController sur «Scroll» avant que ces méthodes ne soient touchées.

1
The Senator

Mon erreur a été de définir la valeur de comptage plus que les pages de contenu réelles dans mon contrôleur d'affichage de page dans la méthode déléguée presentationCount (). 

0
Nupur Sharma