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.
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
}
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()
}
}
}
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]];
}
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.
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()
}
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
}
}
}
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
}
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;
}
}
}