我们可以在UIPageViewController中自定义页面指示器吗?

现在是黑色背景的白点。 如果我想让它成为白色背景的黑点呢?

- (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. 

我不相信你可以操纵UIPageViewController的页面控制。 我的解决scheme

我有一个“根”的UIViewController是UIPageViewControllerDelegate和UIPageViewControllerDataSource。

在这个根视图控制器上,我有@property (strong, nonatomic) IBOutlet UIPageControl *pageControl 。 在相应的故事板笔尖中,我添加一个UIPageControl,放置它,然后选中“隐藏单页”。 如果我愿意,我也可以改变颜色。

然后,我在根视图控制器的viewDidLoad中添加以下内容: self.pageControl.numberOfPages = [self.features count]

我的根视图控制器也有@property (strong, nonatomic) UIPageViewController *pageViewController 。 而在实施中:

 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; 

(注意:设置框架的那一行使得UIPageViewController视图的高度超过了屏幕大小,这样本地页面控件就不再可见了,我的应用程序只有肖像,只有iPhone,所以我在这里得到了一些简单。如果你需要处理旋转,你必须find一个方法来保持本机页面控制离屏。我尝试使用自动布局,但UIPageViewController创build了一套魔术视图,有一堆自动布局面具约束,我不能find一个方法来覆盖。)

无论如何…然后我添加一个额外的UIPageViewController委托方法来改变我的新的非本地UIPageControl到当前select的页面:

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

虽然不像我想的那么漂亮,但是苹果公​​司的这个API并不完全适合高雅。

你可以使用UIAppearance来改变UIAppearance的颜色。 在你的AppDelegate的didFinishLaunchingWithOptions函数中试试这个。

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

编辑:

要仅将样式应用于特定的视图控制器,请改为使用appearanceWhenContainedIn ,如下所示:

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

现在,只有MyViewController中包含的UIPageControl对象才会适应这种风格。

感谢Mike&Shingoo!

编辑:如果你看到在你的屏幕底部的UIPageControl周围的黑色背景,这是由于你的UIPageViewController而不是UIPageControl的背景颜色。 你可以改变这个颜色如下:

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

实际上,您可以在其中一个代表呼叫中将其抓取并本地存储在您自己的财产中。

把这段代码放入你的委托中,访问UIPageViewController中的UIPageControl:

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

你可以在你的子视图中recursion地search它

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

这个对我有用

 UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil]; pageControl.pageIndicatorTintColor = [UIColor whiteColor]; pageControl.currentPageIndicatorTintColor = [UIColor redColor]; pageControl.backgroundColor = [UIColor blackColor]; 

这将改变“MyViewController”的外观。 如果您想在同一视图的不同页面指示器中使用不同的颜色,则必须创build不同的子视图并分别对其进行自定义。

如果使用由UIPageViewController创build的“自动生成”页面指示器,我认为你不能自定义它。 唯一的办法就是添加一个额外的PageControl,或者是Apple提供的或者是@Maschel提供的自定义的。

可以通过外观来定制它。 你可以在AppDelegate中这样做。

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

如果你想为一个特定的视图控制器做这件事,那就用这个代替pageControl。

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

你可以使用SMPageControl: Github 。 它和UIPageController一样工作,但有更多的自定义可能性。

这一个完美的自定义图像

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