UIScrollView отключить прокрутку только в одном направлении? - PullRequest
25 голосов
/ 20 марта 2011

Мне не удалось найти ответ на этот вопрос (возможно, кто-то вместе взломал решение).

Можно ли отключить прокрутку в UIScrollView в одном направлении?Я не говорю об отключении вертикальной или горизонтальной прокрутки, а только в одном направлении.Так, например, в UIScrollView, я хочу иметь возможность перетаскивать представление прокрутки в направлении вниз, но не в направлении вверх

Спасибо

Ответы [ 9 ]

34 голосов
/ 20 марта 2011

Оказывается, простое решение действительно возможно и просто:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > 60) {
        [scrollView setContentOffset:CGPointMake(0, 60)];
    }
}
8 голосов
/ 20 ноября 2012

Это работает для меня:

    -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
        scrollView.bounces = YES;
    }

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView{

        if (scrollView.contentOffset.y < 0) {
            [scrollView setContentOffset:CGPointMake(0, 0)];
            scrollView.bounces = NO;
        }

        if (scrollView.contentOffset.y == 0){
            scrollView.bounces = YES;
        }

        else scrollView.bounces = YES;
    }
5 голосов
/ 09 апреля 2013

К счастью, мы можем использовать scrollRectToVisible, чтобы избежать нервного поведения после того, как прокрутка была ограничена:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > 60) {
        [scrollView setContentOffset:CGPointMake(0, 60)];

        CGFloat pageWidth  = scrollView.frame.size.width;
        CGFloat pageHeight = scrollView.frame.size.height;
        CGRect rect = CGRectMake(0, 0, pageWidth, pageHeight);
        [scrollView scrollRectToVisible:rect animated:YES];
    }
}
3 голосов
/ 16 апреля 2013

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

- (void)scrollViewDidScroll:(UIScrollView *) scrollView {
    if (scrollView.contentOffset.y > 0) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)];
    }
}
1 голос
/ 11 ноября 2013

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

0 голосов
/ 01 июля 2015

Можно убрать прокрутку в вертикальном направлении, установив для высоты scrollView.contentSize то же значение, что и для scrollView.frame.size.height.Любой переполненный контент будет скрыт.То же самое можно, конечно, сделать, чтобы ограничить вертикальную прокрутку.

0 голосов
/ 11 ноября 2014

это работает для меня

static CGPoint lastOffset;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    scrollView.scrollEnabled = YES;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    scrollView.scrollEnabled = YES;
    lastOffset = scrollView.contentOffset;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint nowOffset = scrollView.contentOffset;
    NSLog(@"delta %f", lastOffset.x - nowOffset.x);
    if ((lastOffset.x - nowOffset.x) < 0) {
        //uncomment to prevent scroll to left
        //scrollView.scrollEnabled = NO;
    } else if ((lastOffset.x - nowOffset.x) > 0) {
        //uncomment to prevent scroll to right
        //scrollView.scrollEnabled = NO;
    } else {
        scrollView.scrollEnabled = YES;
    }
}
0 голосов
/ 12 августа 2014

Вместо использования UIScrollViewDelegate для исправления и без того неправильного contentOffset (что приведет к нестабильному поведению) вы можете вместо этого рассмотреть подкласс UIScrollView и переопределить setContentOffset:

- (void)setContentOffset:(CGPoint)contentOffset {
    if (contentOffset.y <= 60) {
        [super setContentOffset:contentOffset];
    }
}

Конечно, это можно обобщить, добавив свойство для минимального или максимального допустимого значения для смещения содержимого. Вам может потребоваться переопределить setContentOffset: animated: также.

0 голосов
/ 18 октября 2012

Альтернативой может быть:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y < 10) {
        scrollView.bounces = NO;
    }

    else scrollView.bounces = YES;
}

Но помните, что это будет работать только для scrollViews, которые имеют больший контент, чем их фреймы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...