Подтвердить что ты не робот

Можем ли мы настроить индикатор страницы в 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.
4b9b3361

Ответ 1

Я не считаю, что вы можете управлять элементом страницы UIPageViewController. Мое решение:

У меня есть "root" UIViewController, который является UIPageViewControllerDelegate и UIPageViewControllerDataSource.

На этом контроллере корневого представления у меня есть @property (strong, nonatomic) IBOutlet UIPageControl *pageControl. В соответствующем ящике раскадровки я добавляю 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;

(SIDE ПРИМЕЧАНИЕ: Эта строка, которая устанавливает кадр, делает высоту представления 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 для этого класса точно не поддается элегантности.

Ответ 2

Вы можете использовать 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;
}

EDIT:

Чтобы применить стиль только к определенному контроллеру представления, используйте appearanceWhenContainedIn, а именно:

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

Теперь только UIPageControl объекты, содержащиеся в MyViewController, будут адаптировать этот стиль.

Спасибо Майку и Шинго!

EDIT: Если вы видите черный фон вокруг UIPageControl в нижней части экрана, это связано с цветом фона вашего UIPageViewController not UIPageControl. Вы можете изменить этот цвет следующим образом:

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

Ответ 3

Вы можете захватить его и сохранить его локально в своей собственной собственности в одном из вызовов делегата.

Поместите этот код внутри вашего делегата для доступа к UIPageControl внутри UIPageViewController:

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

Ответ 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;
}

он работает для меня

Ответ 5

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

Это изменит внешний вид только для "MyViewController". Если вы хотите иметь разные цвета в разных индикаторах страниц на одном и том же представлении, вам необходимо создать разные подзапросы и индивидуально настроить их.

Ответ 6

Если вы используете "автоматический сгенерированный" индикатор страницы, созданный UIPageViewController, я думаю, что вы не можете его настроить. Единственный способ сделать это - добавить дополнительный параметр PageControl, либо тот, который предоставляется Apple, либо пользовательский, как предлагалось @Maschel.

Ответ 7

Можно настроить его по внешнему виду. Вы можете сделать это в 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];

Ответ 8

Вы можете использовать SMPageControl: Github. Он работает так же, как UIPageController, но с большим количеством возможностей настройки.

Ответ 9

Эта функция идеально подходит для пользовательского изображения

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

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