【问题标题】:How to remove the bottom gap of UIPageViewController如何去除 UIPageViewController 的底部间隙
【发布时间】:2022-04-28 16:21:14
【问题描述】:

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

这里是代码

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 实现了 UIPageViewControllerDataSource 协议和 MainViewController 中的必要方法。

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

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

【问题讨论】:

  • 你应该使用 UIPageControl 和 UIScrollView 代替,然后你有细粒度的控制。
  • 向我们展示一些有关如何设置页面视图控制器的代码。
  • @JohnWoods 必须有一种方法,因为 UIPageViewController 应该替换 UIPageControl 和 ScrollView 加上我想要在 xib 编辑器中设计视图的灵活性,我不会在你提到的方法中得到。
  • @bilobatum 添加了代码,请检查。我可以从 UIPageViewController 中搜索 PageControl 并将其隐藏,但该空间仍然存在。
  • 好的,上面的代码看起来不错。所以我们可以排除这个问题。让我们看看别处。您的 NewsItemViewController 是否包含任何布局代码?

标签: ios objective-c uipageviewcontroller


【解决方案1】:

我自己终于找到了解决方案,我只是隐藏了 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);

【讨论】:

  • 感谢您的出色解决方案,为我节省了大量时间!
  • 你可以在图像本身上制作控制指示器而不是删除它吗?我想要那个,因为没有迹象表明用户可以通过移除指示器来滑动。
  • @NunoGonçalves 使用上面的代码你可以访问 UIPageControl ,你可以让它的背景颜色清晰并实现它,基本上你可以在你访问它后自定义指示器,上面的鞋子怎么办。
  • @vishal 我已经尝试过您的方法在内容上显示 UIPageControl,但无论如何它都没有出现。
【解决方案2】:

好奇。 docs 说:

如果“支持页面指示器”中的两种方法都是 实现并且页面视图控制器的转换样式是 UIPageViewControllerTransitionStyleScroll,一个页面指示器是 可见的。

这两种方法是:

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

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

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

UIPageViewControllerTransitionStyleScroll

UIPageViewControllerTransitionStylePageCurl

并查看页面控制指示点是否消失。 (当然是在注释掉你的 hide 方法之后。)

【讨论】:

  • 同意,但我需要这些方法,我想它们需要在您滚动时提供必要的视图数据。
  • 你是对的,如果你切换到 PageCurl 过渡样式,页面控制指示器确实会消失。
  • 去掉上面的两个方法,也去掉了点和间隙。成功!
  • 当您删除程序“presentationCountForPageViewController”和“presentationIndexForPageViewController”时,点正在消失。但是如果你想要这样的场景怎么办>> - 我们想留下点! - 点的背景必须消失! - pageviewcontrol 内的滚动视图必须扩展到全屏 - pagecontrol 的背景不得剪切视图!
  • 访问单个视图并按照我检查提示答案的方式对其进行修改
【解决方案3】:

UIPageViewController 点仅在您实现以下方法时显示:

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

签入您的代码。并且在此方法中返回零也会隐藏点(UIPageControl)

【讨论】:

  • 如果你仔细阅读,我想去除黑条,上面的方法只是去除点而不是间隙。
  • 确实如此,代码可能还有其他问题。它会完全去除条带。
  • 完美,正是我需要的。
【解决方案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()
    }
}

这是 Swift 4 兼容的解决方案,嵌入在 viewDidLayoutSubviews

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
    }
}

【讨论】:

    【解决方案5】:

    Swift 版本:)。在 UIPageViewController 子类中为以下实现返回零。 func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }

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

    【讨论】:

      【解决方案6】:

      这样设置你的寻呼机控制器

      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;
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-08
        • 2019-03-11
        • 2014-01-12
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多