我的应用程序中有一个 UIPageControl,它看起来非常好,大约有 10 个页面(点),但是用户可以添加许多不同的视图,因此点的数量可能会变成 30 个。
发生这种情况时,点会从屏幕边缘消失,并且您无法始终看到当前选择的页面,这一切看起来都很糟糕。
有什么方法可以使页面控件多行,或者在当前可见页面从屏幕消失的那一刻向左或向右移动。
我的应用程序中有一个 UIPageControl,它看起来非常好,大约有 10 个页面(点),但是用户可以添加许多不同的视图,因此点的数量可能会变成 30 个。
发生这种情况时,点会从屏幕边缘消失,并且您无法始终看到当前选择的页面,这一切看起来都很糟糕。
有什么方法可以使页面控件多行,或者在当前可见页面从屏幕消失的那一刻向左或向右移动。
我创建了一个使用包含 UIWebView 的 UIScrollView 的电子书应用程序。这本书有 100 多页,所以 UIPageControl 无法处理它,因为你指出的问题。我最终创建了一个自定义的“滑块”类型视图,该视图的作用类似于 UIPageControl,但可以处理大量页面。这几乎就是您需要做的。UIPage 控件无法处理任意数量的页面...
计算页/点比率并存储为浮点值。然后将当前点数计算为当前页/pagesPerDot。在看到点移动之前,您可能需要前进几页,但它非常可扩展并且运行良好。
我必须在有 30 个项目的水平集合视图下实现 UIPageControl。因此,我通过固定点数并仅在这些点中滚动来减少点数。按照代码:
@IBOutlet var pageControl: UIPageControl!
var collectionDataList = [String]
let dotsCount = 5
override func viewDidAppear(_ animated: Bool) {
if collectionDataList.count < dotsCount {
self.pageControl.numberOfPages = collectionDataList.count
} else {
self.pageControl.numberOfPages = dotsCount
}
}
func scrollViewDidScroll(_ scrollView: UIScrollView)
{
let pageWidth = scrollView.frame.width
self.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
self.pageControl.currentPage = self.currentPage % dotsCount
}
我的解决方案是设置最大点数并在最后一个点之前显示点,直到用户到达末尾。如果当前页码大于最大点数,我们会在最后一页之前显示一页,直到用户到达末尾。
var maxDotCount = 8 //Global constant.
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageWidth = collectionView.frame.size.width
let currentPage = collectionView.contentOffset.x / pageWidth
let pageControlsNumberOfPages = pageControl.numberOfPages - 1
let dataSourceCount = CGFloat(dataSourceArr.count - 1)
let maxDotCountReduced = CGFloat(maxDotCount - 1)
if (dataSourceCount > maxDotCountReduced) {
if (currentPage >= maxDotCountReduced) {
if (currentPage == dataSourceCount) {
pageControl.currentPage = pageControlsNumberOfPages
} else {
pageControl.currentPage = pageControlsNumberOfPages - 1
}
return
}
}
pageControl.currentPage = Int(currentPage)
}