【问题标题】:UIPageViewController page indicator positionUIPageViewController 页面指示器位置
【发布时间】:2014-04-25 19:45:14
【问题描述】:

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

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

有人知道怎么做吗?

编辑

感谢您迄今为止的帮助。我关注了这篇文章: How to put the UIPageControl element on top of the sliding pages within a UIPageViewController?

现在我在顶部有页面控制,但是发生了一些奇怪的事情: 如果您从第 1 页滑动到第 2 页,则指示器指示用户在第 3 页。 我输入了一个 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;
            }
        }
    }

【问题讨论】:

  • 这是同一问题的答案:stackoverflow.com/a/21048603/3532040
  • 我用这个stackoverflow.com/questions/21073891/…把它放在上面
  • 嗨,我认为你能做的最好的事情是创建一个新问题或更改问题的标题?
  • 您是否解决了索引页面的问题?我的自定义页面指示器也遇到了同样的问题。即使我遵循了几个教程中提供的示例。
  • 假设你的参数 viewControllerAfterViewController 是下一个视图控制器并且你的索引是 0,viewControllerAfterViewController 的索引应该是 1,如果你在索引中添加另一个 1 (index++),它将是 2跨度>

标签: ios objective-c uipageviewcontroller


【解决方案1】:

在我们的应用程序中,我将页面指示器放在页面视图控制器视图的顶部,方法是将视图倒置。这真的很愚蠢,除非你有信心,否则我不建议使用这种技术。它是这样的:

[pageWrapperView setTransform:CGAffineTransformRotate([pagingView transform], M_PI)];

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

那么你也需要翻转内容视图,所以它们是正确的。

我有a demo on Github where this technique is used to put a tab bar at the top of the screen

【讨论】:

  • 这让我笑了:D
【解决方案2】:

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

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

...或类似的东西?

【讨论】:

    【解决方案3】:

    您无法处理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];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多