如何将UIPageControl元素放在UIPageViewController中的滑动页面之上?

sn3*_*3ek 59 storyboard uipagecontrol ios uipageviewcontroller

关于如何使用UIPageViewController实现应用程序的AppCoda教程,我想在页面顶部而不是底部使用自定义页面控制元素.

当我只是将页面控制元素放在将要显示的单个视图的顶部时,逻辑结果是控件元素滚动,页面视图远离屏幕.

如何将控制元素置于视图顶部以使页面视图全屏(如图像),以便用户可以在固定控件元素下看到视图?

我附上了一个示例屏幕截图 - 来自AppCoda和Path的信用:

在此输入图像描述

Eri*_* F. 53

我没有让代表对这个产生的答案发表评论,但我真的很喜欢它.我改进了代码并将其转换为swift以用于UIPageViewController的以下子类:

class UIPageViewControllerWithOverlayIndicator: UIPageViewController {
    override func viewDidLayoutSubviews() {
        for subView in self.view.subviews as! [UIView] {
            if subView is UIScrollView {
                subView.frame = self.view.bounds
            } else if subView is UIPageControl {
                self.view.bringSubviewToFront(subView)
            }
        }
        super.viewDidLayoutSubviews()
    }
}
Run Code Online (Sandbox Code Playgroud)

干净,效果很好.无需维护任何内容,只需将您的页面视图控制器作为故事板中此类的实例,或者使您的自定义页面视图控制器类继承此类.


sn3*_*3ek 51

经过进一步的调查和搜索,我找到了一个解决方案,也在stackoverflow上.

关键是要发送到自定义UIPageControl元素的以下消息:

[self.view bringSubviewToFront:self.pageControl];
Run Code Online (Sandbox Code Playgroud)

AppCoda教程是此解决方案的基础:

使用箭头在视图控制器的UIPageControl顶部添加元素RootViewController.

IBOutlet在你的中创建一个相关的元素ViewController.m.

在该viewDidLoad方法中,您应该添加以下代码作为添加所有子视图后调用的最后一个方法.

[self.view bringSubviewToFront:self.pageControl];
Run Code Online (Sandbox Code Playgroud)

要根据当前内容视图的pageIndex分配当前页面,可以将以下内容添加到UIPageViewControllerDataSource方法中:

- (UIPageViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    // ...
    index--;
    [self.pageControl setCurrentPage:index];

    return [self viewControllerAtIndex:index];
}

- (UIPageViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    // ...
    index++;
    [self.pageControl setCurrentPage:index];

    // ...
    return [self viewControllerAtIndex:index];
}
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,在递增/递减索引之前设置pageControl页面.我从该方法获得的viewController是**新视图控制器而不是转换前的那个**. (2认同)
  • 不应该真正推荐在数据源方法中处理`pageControl`.作为数据,您应该做的唯一事情就是返回请求的数据(并避免使用其他逻辑) - 您无法控制何时调用这些方法 - 这取决于实现.例如,在滚动之后,您可以提前观察PageViewController'预取'下一个相邻页面.这完全混淆了你可能潜入的任何秘密逻辑(并且可能解释了为什么@Gokul得到了与@ sn3ek不同的结果).(更好:改用代表) (2认同)

Cod*_*dad 27

sn3ek你的回答让我大部分都在那里.我没有使用这些viewControllerCreation方法设置当前页面.

我让我ViewController also的代表UIPageViewController.然后我在那个方法中设置PageControl's' CurrentPage.使用pageIndex维护我ContentViewController在原始文章中提到.

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
  APPChildViewController *currentViewController = pageViewController.viewControllers[0];
  [self.pageControl setCurrentPage:currentViewController.pageIndex];
}
Run Code Online (Sandbox Code Playgroud)

别忘了把它添加到 viewDidLoad

self.pageViewController.delegate = self;
Run Code Online (Sandbox Code Playgroud)

要跟进PropellerHead的注释,ViewController将使用表单的界面

@interface ViewController : UIViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

  • 只是为了清楚.UIPageViewController的委托是UIPageViewControllerDelegate,因此ViewController的界面将如下所示:```@interface ViewController:UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate>``` (2认同)