我的应用程序中有一个UIPageControl,在大约10个页面(点)时看起来非常好,但是用户可以添加许多不同的视图,因此点的数量可能会变成30。
当发生这种情况时,点会消失在屏幕边缘,您不能总是看到当前选定的页面,使其看起来很糟糕。
是否有任何方法使页面控件多行,或在当前可见页面消失在屏幕上时将其左移或右移。
我的应用程序中有一个UIPageControl,在大约10个页面(点)时看起来非常好,但是用户可以添加许多不同的视图,因此点的数量可能会变成30。
当发生这种情况时,点会消失在屏幕边缘,您不能总是看到当前选定的页面,使其看起来很糟糕。
是否有任何方法使页面控件多行,或在当前可见页面消失在屏幕上时将其左移或右移。
计算页面/点比并存储为浮点值。然后将当前点数计算为当前页数/pagesPerDot。在看到点移动之前,您可能需要提前几页,但它非常可扩展且运行良好。
我创建了一款电子书应用程序,它使用UIScrollView来容纳UIWebView。由于你指出的问题,该书有100多页,因此UIPageControl无法处理。最终,我创建了一种自定义的“滑块”类型视图,它类似于UIPageControl,但可以处理大量页面。这基本上就是你需要做的。 UIPage control无法处理您想要的那么多页面...
我需要在我的水平collection view下实现UIPageControl,该collection view共有30个项。为了减少圆点数量,我决定固定圆点数,只允许在这些圆点中滚动。以下是代码:
@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)
}