Получение текущей страницы

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

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

Ответ 1

Для текущей страницы нет свойства 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;

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

Затем просто позвоните:

scrollView.currentPage

Ответ 4

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


@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

Ответ 5

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

CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);

Ответ 6

Там уже есть хорошие ответы. Тем не менее, для сценариев, где контент не соответствует точно на странице, - и, как и я, вы хотите использовать результат для 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 должно быть:

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
}

Ответ 7

Решение 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;
    }
}

Ответ 8

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

Ответ 9

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

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let width = scrollView.frame.width
        let page = Int(round(scrollView.contentOffset.x/width))
        print("CurrentPage:\(page)")
    }
}

Ответ 10

Я извлек это из нескольких наших приложений...

- (NSInteger)currentPage
{
    if (0 == self.frame.size.width) {
        NSLog(@"frame width == 0!");
        return 0;
    }
    if (! self.currentPageValid) {
        _currentPage = round(self.contentOffset.x / self.frame.size.width);
        self.currentPageValid = YES;
    }
    return _currentPage;
}

Полный источник здесь

Ответ 11

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

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

Довольно просто, он в основном занимает положение scrollview x, делит его на ширину прокрутки, затем округляет его.

Ответ 12

Используете ли вы UIPageControl? Если это так, это свойство currentPage. Если нет, я думаю, вам нужно будет вычислить индекс страницы из смещения scrollView.

Ответ 13

Если кто-нибудь ищет способ сделать в С# для Xamarin

    public int CurrentIndex
    {
        get => (int)Math.Round(this.scrollView.ContentOffset.X / this.scrollView.Frame.Width);
        set => this.scrollView.ScrollRectToVisible(new CGRect(new CGPoint(this.scrollView.Frame.Size.Width * value, 0), this.scrollView.Frame.Size), true);
    }

Этот геттер и сеттер должны предоставить вам текущую страницу, а также позволить вам прокрутить до указанной страницы