Swift/iOS8:为什么页面控制器指示器没有显示?

17

我正在实现一个简单的画廊视图控制器,应用程序会显示一组全屏图片,用户可以滚动浏览。我正在使用UIPageViewController,我认为只要我实现正确的数据源函数,它应该自动显示页面控制指示器。但是我仍然看不到任何指示器。

在我的主要GalleryViewController类中:

class GalleryViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

var pageController: UIPageViewController?
var pageContent = NSArray()

override func viewDidLoad() {
super.viewDidLoad()
.... some code to load images into the pageContent array ....

pageController = UIPageViewController(transitionStyle:.Scroll, navigationOrientation:.Horizontal,options:nil) 
pageController?.delegate = self
pageController?.dataSource = self

... some more standard code to add the page controller to self.view etc.

var pageControl = UIPageControl.appearance()
pageControl.pageIndicatorTintColor = UIColor.lightGray()
pageControl.currentPageIndicatorTintColor = UIColor.whiteColor()
pageControl.backgroundColor = UIColor.blackColor()

pageController!.didMoveToParentViewController(self)
}

func viewControllerAtIndex(index:Int) -> ContentViewController? {
....
}

我已经实现了两个必需的协议方法:viewControllerBeforeViewController和viewControllerAfterController,以及两个用于分页的必需方法presentationCountForPagesViewController和presentationIndexForPageViewController。

我的ContentViewController有一个填满整个屏幕的UIImageView。然而,即使我将其缩小到屏幕底部,仍然无法看到任何页面指示灯。
我错过了什么吗?如果我没有提供足够的信息,请告诉我。我一直在尝试重新编写我五年前使用Objective-C编写的旧应用程序 - 完全使用Swift适用于iOS8和Xcode等环境已经发生了很多变化,这让人感到困惑。
谢谢!

6个回答

30

取自这里

要显示UIPageControl,您需要实现两个可选的数据源方法。presentationCountForPageViewController返回页面的总数,presentationIndexForPageViewController返回最初选择的索引。

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return pageContent.count
}

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

我在我的presentationCountForPageViewController方法中加入了一个println语句进行调试,但它从未被调用。这可能是为什么我的页码计数器点没有显示的原因,但为什么它不会被调用呢?UIPageViewController自动创建页面计数器吗? - Pompey Casmilus
你永远不要将pageController.view作为self.view的子视图添加。 - jrc
13
你可能正在使用错误版本的这些函数。所有的苹果框架方法名称都已重构,以符合新的Swift命名约定。我经常会犯调用错误版本的情况。 - Suman Roy
5
提醒一下,虽然问题中已经有了这个内容,但需要注意的是,为了让上述方法能够正常工作,您需要设置transitionStyle: .scroll, navigationOrientation: .horizontal - Herbal7ea
8
对于Swift 3,函数名称必须完全为:presentationCount(for pageViewController: UIPageViewController)。 - Sean Dev

21

为什么不使用 Zell B.答案的 Swift 3+ 版本呢?

    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return self.providerItemList?.providerItems?.count ?? 0
    }

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

2
这对我有用。旧的方法名称(例如:func presentationCountForPageViewController)在 Xcode 中未被标记,并且仍然完全有效。现在切换到新的方法名称可以显示页面控件指示器。 - Alexander
我也一样! - philthomas26
上帝保佑你! - Ivan
最棒的答案! - fivewood

11
即使您更改了UIPageControl的颜色,它也可能不会显示。如果UIPageController位于UITabBarController内,则标签栏将覆盖UIPageControl。 找到它的最佳方法是使用选项Debug->View Debubging->CaptureViewHierarchy。然后在左下方的过滤器字段中键入“pageControl”。如果您在导航器中单击它,它应该定位到屏幕上(请查看屏幕截图)。

enter image description here

您可以像这样更改位置:
let controlHeight: CGFloat = 50
    let bottomSpace: CGFloat = 20
    let yPosition = view.frame.size.height - (controlHeight + bottomSpace)
    let fullScreenWidth = view.frame.size.width
    let frame = CGRect(x: 0, y: yPosition, width: fullScreenWidth, height: controlHeight)

    pageControl.frame = frame

你只是忘了提到如何修复它! - JoeGalind
1
@JoeGalind 我已经添加了一些基本解决方案。 - milczi

5

虽然这个问题的答案在许多回答中已经丰富地呈现,但我想明确指出,在这些方法被执行之前,你需要将UIPageViewController设置为“滚动”模式。


1
这样就解决了。谢谢! :) - matchifang

1

0

我的错误是在presentationCount()代理方法中将计数值设置为实际内容页面以上的值,而不是与页面视图控制器中的实际内容页面相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接