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

Sep*_*gus 43 objective-c ios 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.
Run Code Online (Sandbox Code Playgroud)

Yas*_* T. 129

您可以使用UIAppearance更改UIPageControl的颜色.在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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
Run Code Online (Sandbox Code Playgroud)

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

谢谢Mike&Shingoo!

编辑: 如果你UIPageControl在屏幕底部看到黑色背景,那是因为你UIPageViewController没有背景颜色UIPageControl.您可以更改此颜色,如下所示:

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

  • 您可以进一步使用`[UIPageControl appearenceInContainer:[MyViewController class],nil]`如果想避免全局更改页面控件 (11认同)
  • [UIPageControl appearanceWhenContainedIn:[MyViewController类],nil]应该是正确的 (3认同)
  • 我喜欢这个答案.更简洁. (2认同)

sir*_*ine 33

我不相信你可以操纵UIPageViewController的页面控件.我的解决方案

我有一个"root"UIViewController,它是UIPageViewControllerDelegate和UIPageViewControllerDataSource.

在这个根视图控制器上,我有@property (strong, nonatomic) IBOutlet UIPageControl *pageControl.在相应的storyboard笔尖中,我添加一个UIPageControl,定位它,并选中"Hides for Single Page".如果我愿意,我也可以改变颜色.

然后,我在根视图控制器的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;
Run Code Online (Sandbox Code Playgroud)

(侧面注释:设置框架的那条线使得UIPageViewController视图的高度超出了屏幕大小,因此本机页面控件不再可见.我的应用程序仅限于纵向,仅限iPhone,所以我在这里稍微有点容易.如果你需要处理旋转,你必须找到一种方法来保持屏幕外的本机页面控制.我尝试使用自动布局,但UIPageViewController创建了一组魔术视图,其中包含一系列自动布局掩码限制,我无法找到一种方法来覆盖.)

无论如何...然后我添加一个额外的UIPageViewController委托方法来将我的新的非本机UIPageControl更改为当前选择的页面:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

不像我想的那么漂亮,但Apple的这个类的API并不完全适合优雅.

  • 无需调整视图框的大小.如果未实现数据源页面指示器方法,则不会显示本机页面控件,并且不会添加视图底部的额外边距. (4认同)

Yar*_*sim 6

实际上,您可以在其中一个委托调用中抓取它并将其本地存储在您自己的属性中.

将此代码放入您的委托中以访问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];
}
Run Code Online (Sandbox Code Playgroud)