处理有太多点无法全部显示在屏幕上的UIPageControl的最佳方法是什么?

9

我的应用程序中有一个UIPageControl,在大约10个页面(点)时看起来非常好,但是用户可以添加许多不同的视图,因此点的数量可能会变成30。

当发生这种情况时,点会消失在屏幕边缘,您不能总是看到当前选定的页面,使其看起来很糟糕。

是否有任何方法使页面控件多行,或在当前可见页面消失在屏幕上时将其左移或右移。


据我所知,如果您有很多页面,最好使用除UIPageControl之外的任何方法。 - Yama
这不是典型的情况,99% 的时间里只有 5-6 页,并且页面视图是有用的和正确的选择。问题在于可以添加任意数量的页面,当发生这种情况时(并不经常),我希望它看起来不那么糟糕。 - BinaryGuy
我曾经看到过这样的实现方式,如果页面数量超过了可用空间,边缘的两个点会变成箭头(旋转的三角形),表示还有更多内容。 - Andrej
你最终找到了更好的解决方案吗? - Jason
5个回答

3

计算页面/点比并存储为浮点值。然后将当前点数计算为当前页数/pagesPerDot。在看到点移动之前,您可能需要提前几页,但它非常可扩展且运行良好。


3

我创建了一款电子书应用程序,它使用UIScrollView来容纳UIWebView。由于你指出的问题,该书有100多页,因此UIPageControl无法处理。最终,我创建了一种自定义的“滑块”类型视图,它类似于UIPageControl,但可以处理大量页面。这基本上就是你需要做的。 UIPage control无法处理您想要的那么多页面...


2

我需要在我的水平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

}

1

我将最大页面数设置为20(在iPhone 5S/SE的纵向模式下适合显示最多20页)...如果我在20页以上,则保持点的位置不变,但将其变为红色。我认为人们会明白它的意思,我经常在屏幕上显示数字页面编号,还有“第一页”和“最后一页”的按钮,我感觉人们更想看到点在初始页面上移动。

输入图像描述

1

我的解决方案是设置最大点数,并在用户到达末尾之前显示倒数第二个点。如果当前页面号码大于最大点数,则显示倒数第二个点,直到用户到达末尾。

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)
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接