Swift:从ScrollView更新UIPageControl

时间:2016-02-28 00:42:15

标签: ios swift uiscrollview uipagecontrol

我似乎遇到了一些让UIPageControl工作的问题。

我有一个包含ScrollView的ViewController。此ScrollView加载可以刷过的nib文件。见图:

enter image description here

以下是加载这些内容的代码:

self.addChildViewController(vc0)
self.displayReportView.addSubview(vc0.view)
vc0.didMoveToParentViewController(self)

var frame1 = vc1.view.frame
frame1.origin.x = self.view.frame.size.width
vc1.view.frame = frame1
self.addChildViewController(vc1)
self.displayReportView.addSubview(vc1.view)
vc1.didMoveToParentViewController(self)

// And so on
...

这样可以正常滚动等。

现在,在ViewController(一个持有scrollview)上我添加了委托:

UIScrollViewDelegate

创建了一些变量:

 var frame: CGRect = CGRectMake(0, 0, 0, 0)
 var colors:[UIColor] = [UIColor.redColor(), UIColor.blueColor(), UIColor.greenColor(), UIColor.yellowColor()]
 var pageControl : UIPageControl = UIPageControl(frame: CGRectMake(50, 300, 200, 20))

我添加了一些所需的功能:

func configurePageControl() {
    // The total number of pages that are available is based on how many available colors we have.

    self.pageControl.numberOfPages = 4
    self.pageControl.currentPage = 0
    self.pageControl.tintColor = UIColor.redColor()
    self.pageControl.pageIndicatorTintColor = UIColor.blackColor()
    self.pageControl.currentPageIndicatorTintColor = UIColor.greenColor()
    self.view.addSubview(pageControl)

}


// MARK : TO CHANGE WHILE CLICKING ON PAGE CONTROL
func changePage(sender: AnyObject) -> () {
    let x = CGFloat(pageControl.currentPage) * displayReportView.frame.size.width
    displayReportView.setContentOffset(CGPointMake(x, 0), animated: true)
}


func scrollViewDidEndDecelerating(scrollView: UIScrollView) {

    let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
    pageControl.currentPage = Int(pageNumber)
}

现在,当我运行应用程序时,滚动视图点显示,但是当我滑动时,它们不会更新。

问题

如何更新点以反映所显示的视图?

  

如果您需要我的代码中的任何其他内容来查看功能,请告诉我们。

2 个答案:

答案 0 :(得分:7)

如果您有分页滚动视图,您当然可以执行您所描述的内容;我有一个使用此代码的示例:

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    let x = scrollView.contentOffset.x
    let w = scrollView.bounds.size.width
    pageControl.currentPage = Int(x/w)
}

除了round之外,您的代码看起来很多,这让我觉得您的代码应该工作。这让我觉得别的东西只是配置错误。 这是一个分页滚动视图吗?您是否记得将此对象设为滚动视图的delegate?使用日志记录或断点确保您的scrollViewDidEndDecelerating首先被调用。

但是,我想指出的是,您所描述的配置实际上是UIPageViewController免费提供的 - 带视图控制器视图的滚动视图以及页面控件 - 因此您可能希望使用它。 / p>

答案 1 :(得分:0)

我会用UICollectionView替换滚动视图。通过这种方式,您可以免费获得分页,并且会更好,因为分页将开箱即用,无需您计算帧偏移。

请务必设置collectionView.pagingEnabled = true

要获取当前页码,请执行collectionView.indexPathsForVisibleItems().first?.item

要更改页面:

collectionView.scrollToItemAtIndexPath(newIndexPath, atScrollPosition: CenteredHorizontally, animated: true)