Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Самый безопасный и самый успешный метод, который я нашел для ограничения перемещения прокрутки, - это подкласс UIScrollView и переопределить setContentOffset: анимированный: и 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];    
}

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

oh, поскольку 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];

Ответ 9

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

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];

Ответ 10

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