47

现在它是黑​​色背景的白点。如果我希望它是白色背景的黑点呢?

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

11 回答 11

130

您可以使用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;
}

编辑:

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

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

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

谢谢迈克和新谷!

编辑: 如果您在屏幕底部看到黑色背景UIPageControl,那是由于您的UIPageViewControllernot的背景颜色UIPageControl。您可以按如下方式更改此颜色:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blueColor]; //Set it to whatever you like
}
于 2013-08-23T17:30:41.530 回答
35

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

我有一个“根”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,所以我在这里稍微轻松了一点。如果您需要处理旋转,则必须找到一种方法使本机页面控件保持在屏幕外。我尝试使用自动布局,但是 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;
}

没有我想的那么漂亮,但是 Apple 的这个类的 API 并不完全适合优雅。

于 2013-07-09T02:41:44.770 回答
7

您实际上可以在其中一个委托调用中获取它并将其本地存储在您自己的财产中。

将此代码放入您的委托中以访问 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];
}
于 2013-10-11T00:16:28.353 回答
4

您可以在子视图中递归搜索它

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

这个对我有用

于 2014-04-10T15:42:30.647 回答
2
UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
pageControl.backgroundColor = [UIColor blackColor];

这将改变“MyViewController”的外观。如果您想在同一视图上的不同页面指示器中具有不同的颜色,则必须创建不同的子视图并单独自定义它们。

于 2013-10-13T11:05:36.160 回答
2

这是我在 Swift 4 中所做的。我首先在 中尝试了类似的答案viewDidLoad,但这最终奏效了。这个相同的片段被用来回答类似的 SO 问题。

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    for view in self.view.subviews{
        if view is UIPageControl{
            (view as! UIPageControl).currentPageIndicatorTintColor = .yellow
            }
        }
    }

在此块中拥有 UIPageControl 后,您应该能够自定义其指示器颜色

于 2018-06-02T13:14:06.347 回答
1

如果您使用 UIPageViewController 创建的“自动生成”页面指示器,我认为您无法自定义它。您可以这样做的唯一方法是添加一个额外的 PageControl,可以是 Apple 提供的一个,也可以是 @Maschel 建议的自定义一个。

于 2013-07-04T11:29:45.027 回答
1

可以通过外观对其进行自定义。您可以像这样在 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];
于 2013-11-26T16:58:12.927 回答
1

这个非常适合自定义图像

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

self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater_selection"]];
于 2017-01-03T07:54:16.937 回答
0

您可以使用 SMPageControl: Github。它的工作方式与 UIPageControl 类似,但具有更多自定义可能性。

于 2013-07-04T11:16:17.777 回答
0

您可以通过定义这样的计算属性轻松访问UIPageViewController's :pageControl

var pageControl: UIPageControl? {
    for subview in view.subviews {
        if let pageControl = subview as? UIPageControl {
            return pageControl
        }
    }
    return nil
}

然后对其进行自定义以满足您的需求,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
    pageControl?.backgroundColor = .white
    pageControl?.pageIndicatorTintColor = .red
    pageControl?.currentPageIndicatorTintColor = .blue
}

明显的警告:如果 Apple 决定更改UIPageViewController视图层次结构,这将停止工作。

于 2018-09-27T17:34:45.387 回答