如何删除UIPageViewController的底部间隙

时间:2013-11-12 17:28:08

标签: ios objective-c uipageviewcontroller

我正在使用UIPageViewController全屏显示图像,UIViewController被添加到UIPageController作为子视图/子图像使用ImageView显示图像。 问题是图像没有全屏显示,而是页面控制视图的底部显示在底部,并且该空间完全被浪费。请查看附件中的图片。

enter image description here

这是代码

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

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

NewsItemViewController *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];

这里NewsItemViewController是UIViewController,显示图像和一些文本,MainViewController在MainViewController中实现UIPageViewControllerDataSource协议和必要的方法。

我相信必须有一种方法可以全屏显示。

***如果重要的话,MainViewController也是故事板的一部分。

7 个答案:

答案 0 :(得分:38)

最后自己解决了这个问题我只是从UIViewPageController隐藏了页面控件,然后扩展了UIPageViewController的大小,以掩盖由于缺少页面控制而留下的空白。

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

thisControl.hidden = true;
self.pageController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+40);

答案 1 :(得分:21)

好奇。 docs说:

  

如果“支持页面指示符”中的两个方法都是   实现和页面视图控制器的过渡样式是   UIPageViewControllerTransitionStyleScroll,页面指示符是   可见。

这两种方法是:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
}

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

您是否实施了这两种数据源方法?如果是这样,也许如果你删除它们,你不必手动删除页面控件(点)?快速测试将是改变

UIPageViewControllerTransitionStyleScroll

UIPageViewControllerTransitionStylePageCurl

并查看页面控制指示符点是否消失。 (当然,在评论出你的隐藏方法之后。)

答案 2 :(得分:14)

只有在实现以下方法后才会显示UIPageViewController点:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController;

检查你的代码。并且在此方法中返回零将隐藏点(UIPageControl)

答案 3 :(得分:4)

我正在添加swift 2.2兼容代码

for view in self.view.subviews {
    if view.isKindOfClass(UIScrollView) {
        view.frame = UIScreen.mainScreen().bounds
    } else if view.isKindOfClass(UIPageControl) {
        view.backgroundColor = UIColor.clearColor()
    }
}

这是嵌入在viewDidLayoutSubviews

中的Swift 4兼容解决方案
for view in self.view.subviews {
    if view.isKind(of:UIScrollView.self) {
        view.frame = UIScreen.main.bounds
    } else if view.isKind(of:UIPageControl.self) {
        view.backgroundColor = UIColor.clear
    }
}

答案 4 :(得分:1)

Swift版:)。在UIPageViewController子类中返回以下实现的零。     func presentationCountForPageViewController(pageViewController:UIPageViewController) - &gt; Int {return 0}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }

答案 5 :(得分:0)

将寻呼机控制器设置为

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

并且实现,此方法应返回任何大于1的值

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
    // The selected item reflected in the page indicator.
    return 2;
}

现在底部空间的间隙被移除,并且没有显示页面控制:)

答案 6 :(得分:0)

将下面的代码粘贴到您的UIPageViewController中:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if let pageScrollView = view.subviews.first {
        pageScrollView.frame = view.bounds
    }
}