最近我编写了关于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;
}
}
}
答案 0 :(得分: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。
答案 1 :(得分:0)
您是否尝试过显式创建页面控件并使用给定的框架添加视图,例如:
UIPageControl *pageControl = [UIPageControl alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
[self.view addSubView:pageControl];
...或类似的东西?
答案 2 :(得分:0)
您无法在viewControllerAfterViewController
和viewControllerBeforeViewController
中处理页面索引,因为在页面更改时不会被调用,并且您将无法获得正确的索引。
相反,我建议你在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];
}
}