Swift: 从 ScrollView 更新 UIPageControl
Swift: Updating UIPageControl from ScrollView
我似乎在使 UIPageControl 正常工作时遇到了一些问题。
我有一个包含 ScrollView 的 ViewController。此 ScrollView 加载可滑动的 nib 文件。见图:
这是加载这些的代码:
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(一个持有滚动视图)上我添加了委托:
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)
}
现在,当我 运行 应用程序时,滚动视图点会显示,但当我滑动时,它们不会更新。
问题
如何更新点以反映显示的视图?
let me know if you need anything else from my code to see functionality.
我会用 UICollectionView
替换滚动视图。这样你就可以免费获得分页,而且会更好,因为分页会开箱即用,你不必计算帧偏移量。
一定要设置collectionView.pagingEnabled = true
要获取当前页码,请执行 collectionView.indexPathsForVisibleItems().first?.item
要更改页面:
collectionView.scrollToItemAtIndexPath(newIndexPath, atScrollPosition: CenteredHorizontally, animated: true)
如果您有 分页 滚动视图,您当然可以执行您所描述的操作;我有一个使用此代码的示例:
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let x = scrollView.contentOffset.x
let w = scrollView.bounds.size.width
pageControl.currentPage = Int(x/w)
}
除了您的 round
,您的代码看起来很多,这让我认为您的代码 应该 有效。这让我觉得其他东西只是配置错误。 这是分页滚动视图吗?您是否记得将此对象设为滚动视图的 delegate
?使用日志记录或断点来确保您的 scrollViewDidEndDecelerating
甚至在第一时间被调用。
但是,我只想指出,您所描述的配置实际上是 UIPageViewController 免费提供给您的——一个带有视图控制器视图的滚动视图,以及一个页面控件——所以您可能想改用它.
我似乎在使 UIPageControl 正常工作时遇到了一些问题。
我有一个包含 ScrollView 的 ViewController。此 ScrollView 加载可滑动的 nib 文件。见图:
这是加载这些的代码:
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(一个持有滚动视图)上我添加了委托:
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)
}
现在,当我 运行 应用程序时,滚动视图点会显示,但当我滑动时,它们不会更新。
问题
如何更新点以反映显示的视图?
let me know if you need anything else from my code to see functionality.
我会用 UICollectionView
替换滚动视图。这样你就可以免费获得分页,而且会更好,因为分页会开箱即用,你不必计算帧偏移量。
一定要设置collectionView.pagingEnabled = true
要获取当前页码,请执行 collectionView.indexPathsForVisibleItems().first?.item
要更改页面:
collectionView.scrollToItemAtIndexPath(newIndexPath, atScrollPosition: CenteredHorizontally, animated: true)
如果您有 分页 滚动视图,您当然可以执行您所描述的操作;我有一个使用此代码的示例:
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let x = scrollView.contentOffset.x
let w = scrollView.bounds.size.width
pageControl.currentPage = Int(x/w)
}
除了您的 round
,您的代码看起来很多,这让我认为您的代码 应该 有效。这让我觉得其他东西只是配置错误。 这是分页滚动视图吗?您是否记得将此对象设为滚动视图的 delegate
?使用日志记录或断点来确保您的 scrollViewDidEndDecelerating
甚至在第一时间被调用。
但是,我只想指出,您所描述的配置实际上是 UIPageViewController 免费提供给您的——一个带有视图控制器视图的滚动视图,以及一个页面控件——所以您可能想改用它.