UIPageViewController页面指示器位置

4

最近我编写了一个关于UIPageViewController的小教程:http://www.appcoda.com/uipageviewcontroller-tutorial-intro/

在完成这个教程后,我想知道是否可以将页面指示器的位置更改到屏幕顶部。

有人知道怎么做吗?

编辑

感谢你们迄今为止的帮助。我按照这篇文章进行了操作:How to put the UIPageControl element on top of the sliding pages within a UIPageViewController?

现在我已经将页面控制放在了顶部,但是一些奇怪的事情发生了: 如果你从第一页滑动到第二页,指示器会显示用户在第三页。 我加入了一个NSLog来显示当前索引,当向下滑动到下一页时,它从0变为1,然后变为2。

有人知道原因吗?

当前代码:

@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;

@end

@implementation APPViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

    self.pageController.dataSource = self;
    [[self.pageController view] setFrame:[[self view] bounds]];

    APPChildViewController *initialViewController = [self viewControllerAtIndex:0];

    NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

    [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    [self addChildViewController:self.pageController];
    [[self view] addSubview:[self.pageController view]];
    [self.pageController didMoveToParentViewController:self];
    UIPageControl *pageControl = [UIPageControl appearance];
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor orangeColor];
    [self.view bringSubviewToFront:self.pageControl];


    //Or whatever number of viewcontrollers you have
    [self.pageControl setNumberOfPages:5];

    }

- (APPChildViewController *)viewControllerAtIndex:(NSUInteger)index {

    APPChildViewController *childViewController = [[APPChildViewController alloc] initWithNibName:@"APPChildViewController" bundle:nil];
    childViewController.index = index;

    return childViewController;

}

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

    NSUInteger index = [(APPChildViewController *)viewController index];

    if (index == 0) {
        return nil;
    }

    // Decrease the index by 1 to return
    index--;
    [self.pageControl setCurrentPage:index];

    return [self viewControllerAtIndex:index];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

    NSUInteger index = [(APPChildViewController *)viewController index];

    index++;
    [self.pageControl setCurrentPage:index];

    if (index == 5) {
        return nil;
    }

    return [self viewControllerAtIndex:index];

}

AppChildViewController:

@property (assign, nonatomic) NSInteger index;    
- (void)viewDidLoad {

        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
        switch(self.index)
        {
            case zero: {
                self.imageView.image = [UIImage imageNamed:@"page1.png"];
                NSLog(@"%d",self.index);
                break;
            }
            case one: {
                self.imageView.image = [UIImage imageNamed:@"page2.png"];
                NSLog(@"%d",self.index);
                break;
            }
            case two: {
                self.imageView.image = [UIImage imageNamed:@"page3.png"];
                NSLog(@"%d",self.index);
                break;
            }
            case three: {
                self.imageView.image = [UIImage imageNamed:@"page4.png"];
                NSLog(@"%d",self.index);
                break;
            }
            default: {
                self.imageView.image = [UIImage imageNamed:@"page5.png"];
                NSLog(@"%d",self.index);
                break;
            }
        }
    }

这是同一个问题的答案:https://dev59.com/JWEi5IYBdhLWcg3wq9_k#21048603 - Lebyrt
我使用了这个https://dev59.com/72Ei5IYBdhLWcg3wptp_来将它放在顶部。 - Eloy
嗨,我认为你可以做的最好的事情就是创建一个新问题或更改问题的标题? - Eloy
你解决了页面索引的问题吗?我在自定义页面指示器上也遇到了同样的问题...即使我按照几个教程中提供的示例进行操作。 - James Paul Mason
假设您的参数viewControllerAfterViewController是下一个视图控制器,而且您当前处于索引0,那么viewControllerAfterViewController的索引应该是1。如果您将另外的1添加到索引(index++),那么它将变成2。 - Francis Yeap
3个回答

1
在我们的应用程序中,我通过将视图颠倒来将页面指示器放置在页面视图控制器视图的顶部。这真的很愚蠢,除非你有信心,否则我不建议使用这种技术。大致步骤如下:
[pageWrapperView setTransform:CGAffineTransformRotate([pagingView transform], M_PI)];

页面视图控制器的视图是 pageWrapperView 的子视图。

然后你需要翻转内容视图,以便它们是正确的方向。

我有一个在 Github 上的演示,展示了如何使用这种技术将选项卡栏放置在屏幕顶部链接


1
这让我笑了 :D - nickdnk

0

你尝试过显式创建页面控件并将其添加到具有给定框架的视图中吗,例如:

UIPageControl *pageControl = [UIPageControl alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
[self.view addSubView:pageControl];

...或类似的东西?


0

viewControllerAfterViewControllerviewControllerBeforeViewController中,您无法处理页面索引,因为它们不一定在页面更改时被调用,您将无法获得正确的索引。

相反,我建议您在pageViewController: didFinishAnimating:previousViewControllers:transitionCompleted:中处理它。

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
    if (finished) {
        APPChildViewController *childViewController = [pageViewController.viewControllers firstObject];
        [self.pageControl setCurrentPage:childViewController.index];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接