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