Как заблокировать горизонтальную прокрутку scrollView в iOS - PullRequest
25 голосов
/ 11 марта 2011

У меня есть scrollView. Я хочу, чтобы он прокручивался только в одном направлении (ВЕРТИКАЛЬНО). Есть ли способ, которым я могу заблокировать горизонтальную прокрутку ... ?? ...

Ответы [ 10 ]

26 голосов
/ 11 марта 2011

Тот же (адаптированный) ответ для вас, как и в:

Отключение вертикальной прокрутки в UIScrollView

верно, все ответы здесь в порядке ...

но если по какой-то странной причине ваш contentSize должен быть выше UIScrollView в обоих измерениях, вы можете отключить горизонтальную прокрутку, реализуя метод протокола UIScrollView -(void)scrollViewDidScroll:(UIScrollView *)aScrollView

просто добавьте это в ваш UIViewController

float oldX; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)];
    // or if you are sure you wanna it always on left:
    // [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)];
}

это просто метод, вызываемый, когда пользователь прокручивает ваш UIScrollView, и при этом вы заставляете его содержимое всегда иметь одинаковое значение. x

13 голосов
/ 11 марта 2011
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

должно помочь.Я просто заблокировал вид прокрутки по горизонтали, выполнив аналогичную технику.

10 голосов
/ 13 мая 2011

Самый безопасный и самый успешный метод, который я нашел, чтобы ограничить движение представления прокрутки, это создать подкласс UIScrollView и переопределить setContentOffset: animated: и setContentOffset: методы (код ниже).

Преимущество переопределения этих методов заключается в том, что он напрямую изменяет запрошенный contentOffset до того, как какой-либо код UIKit начинает воздействовать на него, избегая любых побочных эффектов, которые могут возникнуть при изменении contentOffset в scrollViewDidScroll: или другие UIScrollViewDelegate методы.

Создание нового подкласса занимает всего несколько минут, и он работает как шарм.

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset animated:animated];
}

- (void)setContentOffset:(CGPoint)contentOffset {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset];    
}
2 голосов
/ 05 декабря 2011

Вы можете попробовать это,

self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);

здесь 1450 - это высота моего взгляда.

2 голосов
/ 11 марта 2011

Если свойство UIScrollView contentSize имеет фактическую ширину UIScrollView, то горизонтальная прокрутка невозможна.

Желаете ли вы остановить горизонтальную прокрутку, когда горизонтальная прокрутка будет действительной? (т.е. contentSize шире, чем фактическая ширина UIScrollView?) Если «да», почему вы хотите это сделать?

2 голосов
/ 11 марта 2011

См. В этом вопросе необходимо установить размер прокручиваемого изображения в соответствии с размером представления, чтобы прокручивать было нечего.

1 голос
/ 22 января 2014

о, так как iOS7 использует это (в initWithNibName):

self.automaticallyAdjustsScrollViewInsets = NO;

и создайте скроллер страниц с 3 страницами

self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
1 голос
/ 11 марта 2011

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

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

0 голосов
/ 05 декабря 2017

Swift

Сделать contentOffset.x = 0 для отключения горизонтальной прокрутки

   extension ViewController: UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
            scrollView.contentOffset.x = 0//to lock horizontal scrolling
            //scrollView.contentOffset.y = 0//to lock vertical scrolling
        }
    }

Дополнительно вы можете отключить индикатор прокрутки как

  scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator
    scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator
0 голосов
/ 05 августа 2013

В моем случае contentSize был выше, чем UIScrollView для x и y. Для меня ответ meronixe сработал довольно хорошо, но был для моих нужд не совсем полным. К сожалению, горизонтальная полоса прокрутки все еще была видна.

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];
...