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.
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.
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 UIPageViewController
UIPageControl
. Vous pouvez modifier cette couleur comme suit:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor]; //Set it to whatever you like
}
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];
}
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
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.
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é.
- (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];
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"]];
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
vous pouvez facilement accéder au UIPageViewController
pageControl
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.