web-dev-qa-db-fra.com

Existe-t-il un moyen de changer la couleur des points de l'indicateur de page

Je suis novice dans la programmation iPhone, j'essaie de développer une application qui utilise le contrôle de page. La couleur d'arrière-plan de ma vue est blanche et les contrôleurs de page par défaut sont également blancs, ce qui rend le contrôle de page invisible dans ma vue, j'ai donc changé la couleur de fond du contrôle de page pour qu'elle soit visible. Maintenant, la vue semble corrigée et mauvaise. Existe-t-il un moyen de modifier uniquement la couleur des points pour le contrôle de la page?

Merci d'avance

28
iPhone Programmer

Nous avons personnalisé l'UIPageControl pour utiliser une image personnalisée pour l'indicateur de page, j'ai énuméré les tripes de la classe ci-dessous ...

GrayPageControl.h

@interface GrayPageControl : UIPageControl
{
    UIImage* activeImage;
    UIImage* inactiveImage;
}

GrayPageControl.m

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    activeImage = [[UIImage imageNamed:@"active_page_image.png"] retain];
    inactiveImage = [[UIImage imageNamed:@"inactive_page_image.png"] retain];

    return self;
}

-(void) updateDots
{
    for (int i = 0; i < [self.subviews count]; i++)
    {
        UIImageView* dot = [self.subviews objectAtIndex:i];
        if (i == self.currentPage) dot.image = activeImage;
        else dot.image = inactiveImage;
    }
}

-(void) setCurrentPage:(NSInteger)page
{
    [super setCurrentPage:page];
    [self updateDots];
}

Ensuite, dans le contrôleur de vue, nous l'utilisons simplement comme un UIPageControl normal

IBOutlet GrayPageControl* PageIndicator;

Modifier:

Dans le contrôleur de vue qui a le GrayPageControl, j'ai une IBAction qui est liée à l'événement GrayPageControl.ValueChanged.

-(IBAction) pageChanged:(id)sender
{
    int page = PageIndicator.currentPage;

    // update the scroll view to the appropriate page
    CGRect frame = ImagesScroller.frame;
    frame.Origin.x = frame.size.width * page;
    frame.Origin.y = 0;
    [ImagesScroller scrollRectToVisible:frame animated:YES];
}
52
JWD

L'application se bloque dans iOS7. J'ai une solution pour iOS 7:

Raison du crash:

dans iOS 7 [self.subViews objectAtIndex: i] renvoie UIView Au lieu de UIImageView et setImage n'est pas la propriété de UIView et l'application se bloque. Je résous mon problème en utilisant ce code suivant.

Vérifiez si la sous-vue est UIView (pour iOS7) ou UIImageView (pour iOS6 ou version antérieure). Et si c'est UIView je vais ajouter UIImageView comme sous-vue sur cette vue et le tour est joué et ne plante pas .. !!

-(void) updateDots
{
    for (int i = 0; i < [self.subviews count]; i++)
    {
        UIImageView * dot = [self imageViewForSubview:  [self.subviews objectAtIndex: i]];
        if (i == self.currentPage) dot.image = activeImage;
        else dot.image = inactiveImage;
    }
}
 - (UIImageView *) imageViewForSubview: (UIView *) view
{
    UIImageView * dot = nil;
    if ([view isKindOfClass: [UIView class]])
    {
        for (UIView* subview in view.subviews)
        {
            if ([subview isKindOfClass:[UIImageView class]])
            {
                dot = (UIImageView *)subview;
                break;
            }
        }
        if (dot == nil)
        {
            dot = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, view.frame.size.width, view.frame.size.height)];
            [view addSubview:dot];
        }
    }
    else
    {
        dot = (UIImageView *) view;
    }

    return dot;
}

J'espère que cela résoudra également votre problème pour iOS7. et si Anypone trouve la solution optimale pour cela, veuillez commenter. :)

Codage heureux

18
iProgrammer

La réponse JWD est la voie à suivre. Cependant, si tout ce que vous voulez, c'est simplement changer la couleur, pourquoi ne pas le faire:

Cette technique ne fonctionnera que sur iOS6.0 et supérieur!

enter image description here

Sélectionnez votre UIPageControl allez à l'inspecteur d'attributs. Tada.

Ou bien vous pouvez jouer avec ces 2 propriétés:

  pageIndicatorTintColor  property
  currentPageIndicatorTintColor  property

C'est tellement simple. J'ai relu la question pour m'assurer de ne pas me tromper. Vous voulez vraiment juste changer la couleur n'est-ce pas? Alors oui.

Vous êtes toujours coincé avec ces points délicats. Utilisez la technique JWD pour les superbes images à points.

15
Anonymous White

une seule ligne de code pour répondre à votre demande. L'exemple défini sur la couleur noire.

pageControl.pageIndicatorTintColor = [UIColor blackColor];
7
jianpx

DDPageControl est un excellent remplacement. Vérifiez-le!

Vous pouvez également consulter le billet de blog archivé ici .

5
raidfive

Vous pouvez modifier la couleur de teinte de l'indicateur de page et la couleur de teinte de l'indicateur de page actuelle avec le code suivant:

pageControl.pageIndicatorTintColor = [UIColor orangeColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
4

si vous voulez simplement changer la couleur des points ou le personnaliser, vous pouvez le faire comme recommandé par JWD, mais d'une autre manière:

#pragma mark - LifeCycle

- (void)setCurrentPage:(NSInteger)page
{
    [super setCurrentPage:page];
    [self updateDots];
}

#pragma mark - Private

- (void)updateDots
{
    for (int i = 0; i < [self.subviews count]; i++) {
        UIView* dot = [self.subviews objectAtIndex:i];
        if (i == self.currentPage) {
            dot.backgroundColor = UIColorFromHEX(0x72E7DB);
            dot.layer.cornerRadius = dot.frame.size.height / 2;
        } else {
            dot.backgroundColor = UIColorFromHEX(0xFFFFFF);
            dot.layer.cornerRadius = dot.frame.size.height / 2 - 1;
            dot.layer.borderColor = UIColorFromHEX(0x72E7DB).CGColor;
            dot.layer.borderWidth = 1;
        }
    }
}

En conséquence, vous obtiendrez quelque chose comme

enter image description here

Aussi des macros:

#define UIColorFromHEX(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]
3
gbk

La façon la meilleure et la plus simple de le faire consiste à ajouter les lignes de code suivantes dans la méthode didFinishLaunchingWithOptions dans AppDelegate.m

UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];
2
SteBra

Vous voudrez peut-être jeter un œil à cette solution dans un autre question stackoverflow .

1
Kai Huppmann

Voici une réponse connexe pour l'utilisation d'une image personnalisée (si vous êtes flexible et pouvez utiliser une image plutôt que de modifier directement les couleurs).

Personnaliser le point avec l'image de UIPageControl à l'index 0 de UIPageControl

1
CodenameDuchess