Получение текущей страницы - PullRequest
95 голосов
/ 09 ноября 2010

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

Это скрыто от нас полностью или у меня есть способ получить к нему доступ?

Ответы [ 13 ]

257 голосов
/ 09 ноября 2010

Нет свойства UIScrollView для текущей страницы.Вы можете рассчитать его с помощью:

int page = scrollView.contentOffset.x / scrollView.frame.size.width;

Если вы хотите округлить вверх или вниз до ближайшей страницы, используйте:

CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
30 голосов
/ 14 февраля 2014

Я очень рекомендую вам использовать этот код

int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;

но если вы используете этот код, ваше представление не обязательно должно быть точно на той странице, которую предоставляет indexOfPage. Это потому, что я также рекомендую использовать этот код только в этом методе

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}

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

Я рекомендую вам включить scrollView для постраничного включения с этим кодом

[scrollView setPagingEnabled:YES];

Итак, наконец, это должно выглядеть так

-(void) methodWhereYouSetYourScrollView
{
   //set scrollView
   [scrollView setPagingEnabled:YES];
   scrollView.delegate = self;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
   int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
   //your stuff with index
}
27 голосов
/ 03 августа 2015

В быстром я бы сделал это в расширении:

extension UIScrollView {
    var currentPage:Int{
        return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
    }
}

Тогда просто позвоните:

scrollView.currentPage
12 голосов
/ 25 сентября 2012

Как указано выше, но как категория


@interface UIScrollView (CurrentPage)
-(int) currentPage;
@end
@implementation UIScrollView (CurrentPage)
-(int) currentPage{
    CGFloat pageWidth = self.frame.size.width;
    return floor((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
}
@end
6 голосов
/ 20 августа 2015

Здесь уже есть несколько хороших ответов.Тем не менее, для сценариев, где контент не помещается точно на страницу - и если, как и я, вы хотите использовать результат для UIPageControl, то важно использовать функцию ceil.

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

Я буду основывать это на своем текущем примере из реальной жизни.Ширина содержимого составляет 3140 точек.Исходя из размера рамки представления моей коллекции, ширина страницы составляет 728.

Таким образом, количество страниц равно:

 3140 / 728 = 4.313 

My numberOfPages будет пять.Четыре из которых будут отображаться полностью, а последняя из которых - пятая страница - покажет, что оставшиеся 0.313 содержимого.

Теперь, numberOfPages, равное пяти, означает, что индексы страниц будут равны 0, 1, 2, 3 и 4.

Когда я проводю вправо, переходя к конечному смещению, метод scrollViewDidEndDecelerating дает окончательное смещение X, равное 2412.

Применение вычисления округления:

2412 / 728 = 3.313 then rounded = 3

Это неверно. Просмотр страницы пользователем по смещению должен быть:

Offset / Page User Is Viewing
0        0
728      1
1456     2
2184     3
2412     4

Правильный расчет с использованием ceil:

private func pageForOffset(offset:CGFloat, pageWidth width:CGFloat) -> Int
{
    let page = Int(ceil(offset / width))
    NSLog("\(__FUNCTION__) offset \(offset) width \(width) page \(page) ")
    return page
}
6 голосов
/ 17 января 2012

Просто разделите текущее смещение на размер страницы:

CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
3 голосов
/ 03 сентября 2017

Другой способ :

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let width = scrollView.frame.width
        let page = Int(round(scrollView.contentOffset.x/width))
        print("CurrentPage:\(page)")
    }
}
3 голосов
/ 11 апреля 2016

Для быстрого я бы просто использовал это

    let width = scrollView.frame.width
    let page = round(scrollView.contentOffset.x/width)

Довольно просто, он в основном занимает позицию прокрутки х, делит ее на ширину прокрутки и затем округляет ее.

3 голосов
/ 19 февраля 2016

В xCode 7.x Swift 2.x вы можете сделать:

//MARK: - ScrollView Extensions
// Get the current page number
extension UIScrollView {
    var currentPage: Int {
        return Int(round(self.contentOffset.x / self.bounds.size.width))
    }

// If you have reversed offset (start from contentSize.width to 0)
    var reverseCurrentPage: Int {
        return Int(round((contentSize.width - self.contentOffset.x) / self.bounds.size.width))-1
    }
}
3 голосов
/ 06 июля 2012

Решение Aoakenfo удивительно, это еще одно решение, сочетающее ваш код с функциями scrollViewDidScroll и PageController

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    if (sender == self.scroll) {
        int pageNum = (int)(self.scrPage.contentOffset.x / self.scrPage.frame.size.width);
        self.pagecontroller.currentPage =pageNum;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...