Каков наилучший способ обработки UIPageControl, который имеет так много точек, которые не все помещаются на экране? - PullRequest
8 голосов
/ 20 января 2011

У меня в приложении есть UIPageControl, который отлично выглядит примерно с 10 страницами (точками), однако пользователь может добавить много разных представлений, поэтому число точек может составить, скажем, 30.

Когда это происходит, точки просто исчезают за краем экрана, и вы не всегда можете видеть текущую выбранную страницу, из-за чего все выглядит ужасно.

Есть ли способ сделать многострочное управление страницей или сдвинуть его влево или вправо в тот момент, когда видимая в данный момент страница исчезает с экрана.

Ответы [ 5 ]

3 голосов
/ 22 августа 2012

Рассчитать соотношение страниц / точек и сохранить как значение с плавающей запятой.Затем вычислите текущее число точек как текущую страницу / pagesPerDot.Возможно, вам придется продвинуться на несколько страниц, прежде чем вы увидите движение точки, но это очень масштабируемо и хорошо работает.

3 голосов
/ 20 января 2011

Я создал приложение для электронной книги, которое использовало UIScrollView и содержало UIWebView. В книге было более 100 страниц, поэтому UIPageControl не смог справиться с ней из-за указанной вами проблемы. Я закончил тем, что создал пользовательское представление типа «слайдер», которое действовало подобно UIPageControl, но могло обрабатывать большое количество страниц. Это в значительной степени то, что вам нужно будет сделать. Элемент управления UIPage не может обрабатывать столько страниц, сколько вы хотите ...

2 голосов
/ 18 сентября 2017

Мне пришлось реализовать UIPageControl под моим горизонтальным представлением коллекции, в котором было 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 голос
/ 01 июля 2019

Я установил максимальное количество страниц на 20 (максимальное, которое уместится на iPhone 5S / SE в портретном режиме) .. и если я на странице более 20, я сохраню точку в том же месте, носделать точку красной.Я думаю, что люди понимают, что это значит, у меня часто тоже есть числовой номер страницы на экране, а также кнопки «Первая» и «Последняя», и я чувствую, что люди больше заинтересованы в том, чтобы точка перемещалась на начальных страницах.enter image description here

1 голос
/ 13 декабря 2018

Мое решение - установить максимальное количество точек и показать точку перед последней, пока пользователь не достигнет конца. Если номер текущей страницы больше максимального числа точек, мы показываем номер перед последней, пока пользователь не достигнет конца.

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