Swift/iOS8:为啥不显示页面控制指示器?

Posted

技术标签:

【中文标题】Swift/iOS8:为啥不显示页面控制指示器?【英文标题】:Swift/iOS8: Why are Page Control indicators not showing?Swift/iOS8:为什么不显示页面控制指示器? 【发布时间】:2015-06-19 16:34:49 【问题描述】:

我正在实现一个简单的画廊视图控制器,该应用程序显示一小部分用户可以滚动浏览的全屏图像。我正在使用我认为的 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。但是,即使我在屏幕底部减小它的大小,我也看不到任何页面指示灯。 我在这里错过了什么吗?如果我没有提供足够的信息,请告诉我。我一直在尝试重写我 5 年前在 Objective-C 中编写的旧应用程序 - 完全在 Swift for ios8 和 Xcode 等中发生了很大变化,令人困惑。 谢谢!

【问题讨论】:

【参考方案1】:

取自here:

为了显示 UIPageControl,您需要实现两个可选的数据源方法。只返回presentationCountForPageViewController的全部页数和presentationIndexForPageViewController最初选择的索引

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


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

【讨论】:

我在我的 presentationCountForPageViewController 方法中放置了一个 println 语句进行调试,但它永远不会被调用。这可能是为什么我的页面计数器点没有显示 - 但为什么它没有被调用?页面计数器是使用 UIPageViewController 自动创建的吗? 你永远不会将 pageController.view 添加为 self.view 的子视图。 @PompeyCasmilus 您可能使用了这些函数的错误版本。所有 Apple 框架方法的名称都进行了重构,以匹配新的 Swift 命名约定。我经常调用错误的版本。 请注意,虽然问题已经有了这个,但问题是您需要设置 transitionStyle: .scroll, navigationOrientation: .horizontal 才能使上述方法起作用。 对于 Swift 3,函数名称必须是:presentationCount(for pageViewController: UIPageViewController)【参考方案2】:

为什么不用 swift 3+ 版本的 Zell B. 的答案

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

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

【讨论】:

这是为我做的。旧的方法名称(例如:func presentationCountForPageViewController)在 Xcode 中没有被标记并且仍然完全有效。切换到新方法名称现在会显示页面控制指示器。 我也一样! 上帝保佑你!! 最佳答案!【参考方案3】:

即使您将更改 UIPageControl 的颜色,它也可能不会出现。如果 UIPageController 在 UITabBarController 内,TabBar 将覆盖 UIPageControl。 找到它的最佳方法是使用选项Debug->View Debugging->CaptureViewHierarchy。然后在左下过滤字段中输入“pageControl”。如果您在导航器中单击它,它应该会在屏幕上找到它(查看屏幕截图)

你可以这样改变位置:

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 我添加了一些基本解决方案。【参考方案4】:

尽管答案出现在许多这些答案中,但我只想明确说明,您需要将 UIPageViewController 设置为“滚动”,然后这些方法才会受到影响。

【讨论】:

这修复了它。谢谢! :)【参考方案5】:

我的错误是在presentationCount() 委托方法中将计数值设置为比我的页面视图控制器中的实际内容页面更多。

【讨论】:

【参考方案6】:

这些点是白色或半透明的白色。确保背景不是白色,或更改圆点的颜色。

【讨论】:

以上是关于Swift/iOS8:为啥不显示页面控制指示器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥控制忙指示灯不起作用

显示器连接线拔掉重新插上显示屏不亮了为啥

惠普电脑显示器睡眠状态怎么办

为啥不显示披露指标?

为啥 Linux 下无法识别第二显示器

我的显示器是lgt730b,最近一段时间发现上下距边框约4cm处有一小条显示不太清晰,不知道为啥?谢谢!