UIPageControl 当前页面指示器在显示新视图之前切换

Posted

技术标签:

【中文标题】UIPageControl 当前页面指示器在显示新视图之前切换【英文标题】:UIPageControl Current page indicator switches before new view is presented 【发布时间】:2015-05-19 11:12:14 【问题描述】:

我已经实现了一个 niceUIPageViewControl 和一个PageControl。当滑动指示器改变并显示正确的当前页面。

但是我注意到当前页面指示器切换所需的只是开始滑动。这意味着如果我开始滑动然后松开手指,当前页面指示器已经切换,就像页面已经切换但它没有切换一样。这是我用来进行切换的代码:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

    NSUInteger index = [self.navigationController.viewControllers indexOfObject:viewController];
    self.pageControl.currentPage = index;

我注意到的另一件事是,当我快速左右滑动改变视图时,页面指示器只是卡住并且不会移动。

因此,它仅在您不快速更改视图时才有效。如果您需要任何其他代码,请告诉我。谢谢。

编辑

这是我用来实现 UIPageViewController 的代码。

- (void)viewDidLoad

    [super viewDidLoad];
    // Create the data model

    self.navigationItem.title = @"Tabell";
    self.identifiers = [[NSMutableArray alloc] init];

    [self.identifiers addObject:@"rankTable"];
    [self.identifiers addObject:@"page2"];

    // Create page view controller
    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageViewController.dataSource = self;
    self.pageViewController.delegate = self;


    self.navigationController.delegate = self;
    CGSize navBarSize = self.navigationController.navigationBar.bounds.size;
    CGPoint origin = CGPointMake( navBarSize.width/2, navBarSize.height/2 );
    self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(origin.x, origin.y+16,
                                                                       0, 0)]; //Here added 45 to Y and it did the trick


    self.pageControl.pageIndicatorTintColor = navbarColor;
    self.pageControl.currentPageIndicatorTintColor = [UIColor lightGrayColor];

    [self.pageControl setNumberOfPages:2];

    [self.navigationController.navigationBar addSubview:self.pageControl];

    UITableViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

     CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;

    // Change the size of page view controller
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - tabBarHeight);

    [self addChildViewController:_pageViewController];
    [self.view addSubview:_pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];


【问题讨论】:

快速换视图时,完全不动还是动完后才动? 它根本不动。 @sasquatch 不是重复的,但您可以使用类似的技术:***.com/questions/6310031/… 我不明白它是如何实现的。价值的宽度是多少? @picciano 它是页面宽度,通常与滚动视图宽度相同。 【参考方案1】:

你为什么不实现UIPageViewControllerDelegate

- pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted: 方法?它有一个transitionCompleted 布尔值,它告诉你是否应该更新你的页面控件。您当前的实现似乎有问题,因为一旦您在页面上加注星标,它就会为下一页加载视图控制器并调用 ...didShow... 方法。希望这能有所帮助。

【讨论】:

我试图实现这一点。我在函数中放置了一个 NSLog,它就像我当前的函数一样工作。我一开始滑动,NSLog 就被触发了? 您是否检查了“transitionCompleted”布尔值?

以上是关于UIPageControl 当前页面指示器在显示新视图之前切换的主要内容,如果未能解决你的问题,请参考以下文章

如何以不同的方式设置 UIPageControl 的当前页面指示点的样式?

使用 UIPageControl 减小点大小或填充以适应屏幕上的所有页面指示器

iOS 14 UIPageControl 未选择的页面被视为 currentPage

iOS:滚动视图在屏幕外显示页面控件

UIpageControl 指示点

UIPageControl 指示点在页面更改时不会更改