web-dev-qa-db-fra.com

Couleur d'arrière-plan du contrôle de page UIPageViewController

j'utilise UIPageViewController dans mon application et tout fonctionne correctement. Cependant, le contrôle de page ajouté automatiquement a un arrière-plan noir qui cache le contenu du bas du contrôleur de vue actuel (voir l'illustration ci-dessous). Est-il possible d'appeler le contrôle de page d'UIPageViewController et de changer sa couleur? Je veux que le contrôle de page soit affiché sur le contrôleur de vue (par exemple, la procédure pas à pas de l'application Path), comme pour définir la couleur au lieu de noir pour effacer.

enter image description here

41
user1938695

Vous pouvez utiliser appearance pour changer la couleur de UIPageControl, sinon elle n’est pas accessible. Essayez de le faire dans la fonction didFinishLaunchingWithOptions de votre AppDelegate comme indiqué ci-dessous.

- (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;
}

Pour appliquer le style uniquement à un contrôleur de vue particulier, vous pouvez utiliser appearanceWhenContainedIn comme suit:

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

Seuls les objets UIPageControl contenus dans MyViewController obtiendront ce style.

EDIT: Le fond noir autour de UIPageControl au bas de votre écran est dû à la couleur de fond de votre UIPageViewController pas UIPageControl. Vous pouvez changer cette couleur comme suit:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blueColor]; //Set it to whatever you like
}
84
Yas T.

Mis à jour pour Swift 3 :

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    for view in self.view.subviews {
        if view is UIScrollView {
            view.frame = UIScreen.main.bounds
        } else if view is UIPageControl {
            view.backgroundColor = UIColor.clear
        }
    }
}

Swift 2 exemple pour ceux qui en ont besoin. Placez ceci dans votre sous-classe UIPageController.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    for view in self.view.subviews {
        if view is UIScrollView {
            view.frame = UIScreen.mainScreen().bounds
        } else if view is UIPageControl {
            view.backgroundColor = UIColor.clearColor()
        }
    }
}
24
jlichti

Ajoutez le code suivant dans UIPageViewController.

- (void)viewDidLoad {
    [super viewDidLoad];
    [[UIPageControl appearance] setPageIndicatorTintColor: [UIColor grayColor]];
    [[UIPageControl appearance] setCurrentPageIndicatorTintColor: [UIColor whiteColor]];
    [[UIPageControl appearance] setBackgroundColor: [UIColor darkGrayColor]];
}
8
Brandon Yang

Il suffit de sous-classer UIPageViewController et d'ajouter ce code:

- (void)viewDidLayoutSubviews {
  [super viewDidLayoutSubviews];
  for (UIView *view in self.view.subviews) {
    if ([view isKindOfClass:[NSClassFromString(@"_UIQueuingScrollView") class]]) {
      CGRect frame = view.frame;
      frame.size.height = view.superview.frame.size.height;
      view.frame = frame;
    }
  }
}

Cela étendra le cadre de la vue de défilement interne.

8
orkenstein

Voici la Swift 2 + version de Yas-T 's Answer

//In AppDelegate
let pageControl = UIPageControl.appearance()
pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
pageControl.currentPageIndicatorTintColor = UIColor.blackColor()
pageControl.backgroundColor = UIColor.blueColor()

//Or in your ViewController (Only available on IOS 9.0)
if #available(iOS 9.0, *) {
   let pageControl = UIPageControl.appearanceWhenContainedInInstancesOfClasses([ViewController.self])
   pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
   pageControl.currentPageIndicatorTintColor = UIColor.darkGrayColor()
}
3

Remplacez la fonction viewDidLayoutSubviews() dans PageViewController:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    for view in view.subviews{
        if view is UIScrollView{
            view.frame = UIScreen.main.bounds
        }else if view is UIPageControl{
            view.backgroundColor = UIColor.clear
        }
    }
}
3
AnhSang

Voici la Swift 3+ version de la réponse acceptée (avec le plus d'une couleur personnalisée créée):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    if #available(iOS 9.0, *) {

        let pageControl = UIPageControl.appearance(whenContainedInInstancesOf: [UIPageViewController.self])
        pageControl.pageIndicatorTintColor = UIColor.init(colorLiteralRed: 43/255.0, green: 170/255.0, blue: 226/255.0, alpha: 0.4)
        pageControl.currentPageIndicatorTintColor = UIColor.init(colorLiteralRed: 43/255.0, green: 170/255.0, blue: 226/255.0, alpha: 1.0)        
    }

    return true
}
2
Alex

Eh bien, j'ai trouvé une solution de travail. Dans votre UIPageViewController, ajoutez simplement le code suivant:

-(void)viewDidLayoutSubviews
{
   [super viewDidLayoutSubviews];

   for (UIView *view in self.view.subviews)
   {
       if ([view isKindOfClass:UIScrollView.class])
       {
           CGRect frame      = view.frame;

           frame.size.height = view.superview.frame.size.height;

           view.frame        = frame;
       }

       if ([view isKindOfClass:UIPageControl.class])
       {
           CGFloat newHeight    = 22;

           CGRect frame         = view.frame;

           frame.Origin.y      += frame.size.height - newHeight;
           frame.size.height    = newHeight;

           view.frame           = frame;
           view.backgroundColor = UIColor.darkGrayColor;
           view.alpha           = 0.3;
       }
   }

}

0
ALiEN