it-roy-ru.com

Как заблокировать горизонтальную прокрутку scrollView в iOS

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

25
A for Alpha

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

Отключение вертикальной прокрутки в 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

26
meronix
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

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

13
Sean S Lee

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

Преимущество переопределения этих методов заключается в том, что он напрямую изменяет запрошенный 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];    
}
10
Mike Hay

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

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

здесь 1450 моя высота зрения.

2
Sharme

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

2
Tomas Vana

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

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

2
occulus

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

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

1
user655152

о, так как 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
Mirko Brunner

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

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

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

Свифт

Сделайте 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
Jack