2015-03-04 3 views
2

У меня 3 страницы - ViewController, B ViewController и C ViewController.iOS Как изменить динамическое изменение цвета PageControl при изменении страницы?

И элемент управления PageViewController имеет горизонтальную прокрутку.

PagesViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.aVC = [self.storyboard 
     instantiateViewControllerWithIdentifier:@"AViewController"]; 
    self.bVC = [self.storyboard 
      instantiateViewControllerWithIdentifier:@"BViewController"]; 
    self.cVC = [self.storyboard 
      instantiateViewControllerWithIdentifier:@"CViewController"]; 

    self.delegate = self; 
    self.dataSource = self; 

    self.allViewControllers = @[self.aVC,self.bVC 
          ,self.cVC]; 

    [self setViewControllers:@[self.aVC] 
       direction:UIPageViewControllerNavigationDirectionForward 
       animated:NO completion:nil]; 

    _pageControl = [UIPageControl appearance]; 

} 

Я хочу изменить цвет _pageControl, когда я выделите A VC, B VC и C VC.

Так что я положил код в

-(NSInteger)presentationIndexForPageViewController: 
(UIPageViewController *)pageViewController 
{ 

    NSLog(@"%@",pageViewController.viewControllers[0]); 
    for(int i = 0 ; i< self.allViewControllers.count ; i++) 
    { 
     if(pageViewController.viewControllers[0] == self.allViewControllers[i]) 
     { 
      if(i ==0) 
      { 
       _pageControl.backgroundColor = [UIColor greenColor]; 
      } 
      else if(i ==1) 
      { 
       _pageControl.backgroundColor = [UIColor redColor]; 
      } 
      else 
      { 
       _pageControl.backgroundColor = [UIColor clearColor]; 
      } 
      NSLog(@"return index:%d", i); 
      return i; 
     } 
    } 

    return 0; 
} 

Но контроль страница не изменит цвет.

Я пытаюсь поставить ниже код в viewDidLoad, он изменит цвет на всех контроллерах вида.

_pageControl.backgroundColor = [UIColor redColor]; 

Но теперь я хочу, чтобы изменить цвет PageControl, когда я прокручиваю к различным UIViewController.

Как я могу это сделать? или Как обновить цвет страницы?

Потому что теперь цвет всегда черный.

Я предлагаю другой метод делегата о PageViewController:

-(UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 

{

NSUInteger currentIndex = [self.allViewControllers indexOfObject:viewController]; 
if(currentIndex == 0) 
{ 
    return nil; 
} 
currentIndex--; 


    return [self.allViewControllers objectAtIndex:currentIndex]; 
} 

-(UIViewController *) pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger currentIndex = [self.allViewControllers indexOfObject:viewController]; 


    NSLog(@"after currentIndex:%ld",currentIndex); 
    currentIndex++; 

if(currentIndex == [self.allViewControllers count]) 
{ 
    return nil; 
} 

    return [self.allViewControllers objectAtIndex:currentIndex]; 
} 


-(NSInteger)presentationCountForPageViewController: 
(UIPageViewController *)pageViewController 
{ 
    return self.allViewControllers.count; 
} 

ответ

1

В ваших viewDidLoad: метод,

вместо:

_pageControl = [UIPageControl appearance]; 

использование:

NSArray *subviews = self.view.subviews; 
_pageControl = nil; 
for (int i=0; i<[subviews count]; i++) { 
    if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) { 
     _pageControl = (UIPageControl *)[subviews objectAtIndex:i]; 
    } 
} 

=====

EDIT:

Для вашего конкретного проекта, вы не получаете _pageControl (это return nil), потому что Storyboard не завершил создание экземпляра вашего контроллера представления в viewDidLoad. Я думал, что нужно будет в viewDidAppear: анимировать, но это тоже не сработало, поэтому я обманул, отложив запрос на 0.2 миллисекунды.

В вашем viewDidLoad, поставить это:

[self performSelector:@selector(findPageControl) withObject:nil afterDelay:0.2f]; 

Затем добавьте этот метод:

- (void) findPageControl { 
    NSArray *subviews = self.view.subviews; 
    _pageControl = nil; 
    for (int i=0; i<[subviews count]; i++) { 
     if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) { 
      _pageControl = (UIPageControl *)[subviews objectAtIndex:i]; 
     } 
    } 
    [self changePage:0]; 
} 

В вашем методе viewControllerAfterViewController, я добавил это право после того, как NSUInteger currentIndex = линии:

[self changePage:currentIndex]; 

Это похоже на то, что это сработало. Теперь вы можете добавить анимацию в свой метод changePage, чтобы сделать переход немного более плавным.

Кроме того, при отладке, это то, что я сделал:

я добавил точку останова на _pageControl = линии, так что я мог проверить и посмотреть, что происходит. Когда я увидел, что это было ноль, это сказало мне, что он не устанавливается должным образом. Посмотрите в области отладки, и вы можете увидеть, что я распечатал («po»), чтобы увидеть, какие значения существуют, и почему не было UIPageControl. Если вы сделаете то же самое после изменений, перечисленных выше, вы увидите, что это теперь найдено и установлено.

enter image description here

+0

Это пробегает все подзоны и находит ссылку UIPageControl, в которой вам необходимо изменить фон (или что бы вы ни хотели). –

+0

Привет, метод не может использоваться в UIPageViewController. Я использую метод, затем я пытаюсь _pageControl.backgroundColor = [UIColor redColor]; в viewDidLoad. Или я пытаюсь добавить - (void) changePage: (NSInteger) currentPage; в pageViewController: viewControllerAfterViewController; Нет никакого изменения цвета pagecontrol. @@? – Stella

+0

Я использовал этот проект: https://www.dropbox.com/s/iecfyqffudzyybp/PageViewControllerExample.zip?dl=0 –

1

Вот пример, только с PageControl в UIViewController:

#import "ViewController.h" 

@interface ViewController() { 
    UIPageControl *pageControl; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor lightGrayColor]; 

    pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(10, 10, 100, 40)]; 
    pageControl.numberOfPages = 6; 
    [pageControl addTarget:self action:@selector(changePage:) forControlEvents:UIControlEventValueChanged]; 

    [self.view addSubview:pageControl]; 
} 

- (void) changePage:(UIPageControl *)page { 
    NSInteger currentPage = page.currentPage; 
    switch (currentPage) { 
     case 0: 
      pageControl.backgroundColor = [UIColor redColor]; 
      break; 
     case 1: 
      pageControl.backgroundColor = [UIColor greenColor]; 
      break; 
     case 2: 
      pageControl.backgroundColor = [UIColor blueColor]; 
      break; 

     default: 
      break; 
    } 
} 

@end 
+0

Привет, Если я использую UIPageViewController, Как я могу сделать? – Stella

+0

Я также разместил это исправление, но подумал, что я должен оставить это на случай, если у кого-то есть такая же проблема, но с UIPageControl. –

Смежные вопросы