it-swarm.com.ru

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

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

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

92
user440096

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

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

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
}
29
Jiří Zahálka

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

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

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

scrollView.currentPage
27
Andrius Steponavičius

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


@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
12
user363349

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

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

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

Итак, количество страниц равно:

 3140 / 728 = 4.313 

Моему 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
Max MacLeod

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

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

По-другому :

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

В 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
Alessandro Ornano

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

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

- (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;
}

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

2
Barry

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

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

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

2
Jackson U

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

1
wvteijlingen

Если кто-нибудь ищет способ сделать в C # для 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);
    }

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

0
soan saini