Pouvons-nous personnaliser L'indicateur de page dans UIPageViewController?

maintenant ce sont des points blancs avec fond noir. Et si je veux que ce soit des points noirs avec des fonds blancs?

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0)
{
    return _imageArrays.count;
}// The number of items reflected in the page indicator.
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0)
{
    return self.intCurrentIndex;
}// The selected item reflected in the page indicator.
43
demandé sur Vadim Kotov 2013-07-04 13:29:14

11 réponses

Je ne crois pas que vous puissiez manipuler le contrôle de page de L'UIPageViewController. Ma solution:

j'ai un UIViewController" root " qui est UIPageViewControllerDelegate et UIPageViewControllerDataSource.

sur ce contrôleur de vue racine, j'ai @property (strong, nonatomic) IBOutlet UIPageControl *pageControl. Dans le storyboard nib correspondant, j'ajoute un UIPageControl, je le positionne, et je vérifie "se cache pour une seule Page". Je peux aussi changer les couleurs, si je le souhaite.

puis, j'Ajoute ce qui suit à la racine vue du contrôleur de viewDidLoad: self.pageControl.numberOfPages = [self.features count]

mon contrôleur de vue racine a aussi @property (strong, nonatomic) UIPageViewController *pageViewController. Et dans la mise en œuvre:

self.pageViewController = [[UIPageViewController alloc]
          initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll 
            navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal 
                          options:nil];


self.pageViewController.delegate = self;
DataViewController *startingViewController = [self viewControllerAtIndex:0 storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:NO
                                 completion:NULL];
self.pageViewController.dataSource = self;      
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
self.pageViewController.view.frame = CGRectMake(0.0, 0.0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height + 10.0);
[self.pageViewController didMoveToParentViewController:self];
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

(note latérale: cette ligne qui fixe le cadre fait que la hauteur de la vue de L'UIPageViewController dépasse la taille de l'écran de sorte que le contrôle de page natif n'est plus visible. Mon application est portrait seulement, iPhone seulement, donc je suis parti un peu facile ici. Si vous avez besoin de gérer les rotations, vous devrez trouver un moyen de garder ce contrôle de page natif hors de l'écran. Je essayé en utilisant la mise en page automatique, mais UIPageViewController crée un ensemble de vues magiques qui ont un tas de contraintes de masque d'autolayout que je n'ai pas pu trouver un moyen de passer outre.)

de toute façon...puis j'ajoute une méthode UIPageViewController delegate supplémentaire pour changer mon nouveau contrôle UIPageControl non natif à la page actuellement sélectionnée:

- (void)pageViewController:(UIPageViewController *)viewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
  if (!completed){return;}

  // Find index of current page
  DataViewController *currentViewController = (DataViewController *)[self.pageViewController.viewControllers lastObject];
  NSUInteger indexOfCurrentPage = [self indexOfViewController:currentViewController];
  self.pageControl.currentPage = indexOfCurrentPage;
}

pas aussi jolie que je le voudrais, mais L'API D'Apple pour cette classe ne se prête pas vraiment à l'élégance.

33
répondu sirvine 2013-07-09 02:51:57

Vous pouvez utiliser UIAppearance pour changer la couleur D'UIPageControl. Essayez ceci dans votre AppDelegate didFinishLaunchingWithOptions fonction.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIPageControl *pageControl = [UIPageControl appearance];
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
    pageControl.backgroundColor = [UIColor blueColor];

    return YES;
}

EDIT:

pour appliquer le style uniquement à un contrôleur de vue particulier, utilisez appearanceWhenContainedIn au lieu de cela, comme suit:

UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];

Maintenant, seulement UIPageControl les objets contenus dans le MyViewController vont adapter ce style.

Merci Mike & Shingoo!

EDIT: Si vous voyez le fond noir autour UIPageControl en bas de votre écran, c'est dû à la couleur de fond de votre UIPageViewControllerUIPageControl. Vous pouvez modifier cette couleur comme suit:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blueColor]; //Set it to whatever you like
}
128
répondu Yas T. 2014-02-23 21:26:41

Vous pouvez effectivement saisir et stocker localement dans votre propre propriété dans l'une des délégué appels.

mettez ce code à l'intérieur de votre délégué pour accéder à L'UIPageControl à l'intérieur du UIPageViewController:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    [self setupPageControlAppearance];
    return kPageCount;
}

- (void)setupPageControlAppearance
{
    UIPageControl * pageControl = [[self.view.subviews filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(class = %@)", [UIPageControl class]]] lastObject];
    pageControl.pageIndicatorTintColor = [UIColor grayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
}
6
répondu Yariv 2016-05-20 00:47:09

Vous pouvez effectuer une recherche récursive dans vos fichiers

- (void)findAndConfigurePageControlInView:(UIView *)view
{
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UIPageControl class]]) {
            UIPageControl * pageControl = (UIPageControl *)subview;
            //customize here
            pageControl.hidesForSinglePage = YES;
            break;
        } else {
            [self findAndConfigurePageControlInView:subview];
        }
    }
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    [self findAndConfigurePageControlInView:self.view];
    return self.promotionsVCs.count;
}

cela fonctionne pour moi

4
répondu CyberKid 2014-04-10 15:42:30
UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
pageControl.backgroundColor = [UIColor blackColor];

cela va changer l'apparence juste pour "MyViewController". Si vous voulez avoir des couleurs différentes dans des indicateurs de page différents sur la même vue, vous devez créer des sous-vues différentes et les personnaliser individuellement.

2
répondu Shingoo 2013-10-13 11:05:36

si vous utilisez l'indicateur de page" généré automatiquement " créé par UIPageViewController, je pense que vous ne pouvez pas le personnaliser. La seule façon de le faire est d'ajouter un contrôle de page supplémentaire, soit celui fourni par Apple, soit un contrôle personnalisé comme @Maschel l'a proposé.

1
répondu Heckscheibe 2013-07-04 11:29:45
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   UIPageControl *pageControl = [UIPageControl appearance];
   pageControl.pageIndicatorTintColor = [UIColor whiteColor];
   pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
   pageControl.backgroundColor = [UIColor lightGrayColor];

   return YES;
}

si vous voulez le faire juste pour un certain contrôleur de vue, remplacez le pageControl par ceci à la place.

UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
1
répondu Zeezer 2013-11-26 16:58:12

celui-ci fonctionne parfaitement pour l'image personnalisée

self.pageControl.pageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater"]];

self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater_selection"]];
1
répondu Gurumoorthy Arumugam 2017-01-03 07:54:16

vous pouvez utiliser SMPageControl: Github. Il fonctionne comme L'UIPageControl mais avec plus de possibilités de personnalisation.

0
répondu Maschel 2018-01-20 21:45:25

voici ce que J'ai fait dans Swift 4. J'ai essayé le même genre de réponses tout d'abord, dans viewDidLoad, mais c'est ce qui a finalement fonctionné. Ce même extrait a été utilisé pour répondre à des questions similaires.

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    for view in self.view.subviews{
        if view is UIPageControl{
            (view as! UIPageControl).currentPageIndicatorTintColor = .yellow
            }
        }
    }

une fois que vous avez L'UIPageControl dans ce bloc, vous devriez pouvoir personnaliser ses couleurs indicatrices

0
répondu wsgeorge 2018-06-02 13:14:06

vous pouvez facilement accéder au UIPageViewControllerpageControl en définissant une propriété calculée comme ceci:

var pageControl: UIPageControl? {
    for subview in view.subviews {
        if let pageControl = subview as? UIPageControl {
            return pageControl
        }
    }
    return nil
}

Et ensuite le personnaliser à vos besoins suite comme ceci:

override func viewDidLoad() {
    super.viewDidLoad()
    pageControl?.backgroundColor = .white
    pageControl?.pageIndicatorTintColor = .red
    pageControl?.currentPageIndicatorTintColor = .blue
}

mise en garde évidente: si Apple décide de changer le UIPageViewController voir la hiérarchie ceci va cesser de fonctionner.

0
répondu boliva 2018-09-27 18:00:27